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; }
   }
