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