asp.net Web Api-сообщения об ошибках по умолчанию
есть ли способ изменить поведение веб-Api по умолчанию для сообщений об ошибках, таких как:
GET /trips/abc
отвечает (перефразировано):
HTTP 500 Bad Request
{
"Message": "The request is invalid.",
"MessageDetail": "The parameters dictionary contains a null entry for parameter 'tripId' of non-nullable type 'System.Guid' for method 'System.Net.Http.HttpResponseMessage GetTrip(System.Guid)' in 'Controllers.TripController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
}
Я хотел бы избежать предоставления этой довольно подробной информации о моем коде и вместо этого заменить ее чем-то вроде:
HTTP 500 Bad Request
{
error: true,
error_message: "invalid parameter"
}
я мог бы сделать это внутри UserController, но выполнение кода даже не заходит так далеко.
edit:
Я нашел способ удаления подробные сообщения об ошибках из выходных данных, используя эту строку кода в Global.асакс.cs:
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy =
IncludeErrorDetailPolicy.LocalOnly;
это создает сообщение, подобное этому:
{
"Message": "The request is invalid."
}
что лучше, однако не совсем то, что я хочу - мы указали ряд числовых кодов ошибок, которые сопоставляются с подробными сообщениями об ошибках на стороне клиента. Я хотел бы вывести только соответствующий код ошибки (который я могу выбрать до вывода, предпочтительно, увидев, какое исключение произошло), для пример:
{ error: true, error_code: 51 }
2 ответов
вы можете сохранить форму данных как тип HttpError, даже если вы хотите скрыть подробную информацию о фактическом исключении. Для этого можно добавить пользовательский DelegatingHandler для изменения HttpError, который генерирует служба.
вот пример того, как может выглядеть DelegatingHandler:
public class CustomModifyingErrorMessageDelegatingHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>((responseToCompleteTask) =>
{
HttpResponseMessage response = responseToCompleteTask.Result;
HttpError error = null;
if (response.TryGetContentValue<HttpError>(out error))
{
error.Message = "Your Customized Error Message";
// etc...
}
return response;
});
}
}
просто хотел некоторые биты к ее коду для дополнительного разъяснения:
HttpResponseMessage response = responseToCompleteTask.Result;
HttpError error = null;
if ((!response.IsSuccessStatusCode) && (response.TryGetContentValue(out error)))
{
// Build new custom from underlying HttpError object.
var errorResp = new MyErrorResponse();
// Replace outgoing response's content with our custom response
// while keeping the requested MediaType [formatter].
var content = (ObjectContent)response.Content;
response.Content = new ObjectContent(typeof (MyErrorResponse), errorResp, content.Formatter);
}
return response;
где:
public class MyErrorResponse
{
public MyErrorResponse()
{
Error = true;
Code = 0;
}
public bool Error { get; set; }
public int Code { get; set; }
}