Как поймать все исключения в Web API 2?

Я пишу RESTful API в веб-API, и я не уверен, как эффективно обрабатывать ошибки. Я хочу, чтобы API возвращал JSON, и он должен состоять из одного и того же формата каждый раз - даже при ошибках. Вот несколько примеров того, как может выглядеть успешный и неудачный ответ.

Success

{
    Status: 0,
    Message: "Success",
    Data: {...}
}

Ошибка:

{
    Status: 1,
    Message: "An error occurred!",
    Data: null
}

Если есть исключение - вообще исключение, я хочу вернуть ответ, который сформирован как второй. Каков безопасный способ сделать это, чтобы исключение не было обработано?

Ответ 1

IExceptionHandler.

Что-то вроде:

 public class APIErrorHandler : IExceptionHandler
 {
     public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
     {
         var customObject = new CustomObject
             {
                 Message = new { Message = context.Exception.Message }, 
                 Status = ... // whatever,
                 Data = ... // whatever
             };

        //Necessary to return Json
        var jsonType = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
        json.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;    

        var response = context.Request.CreateResponse(HttpStatusCode.InternalServerError, customObject, jsonType);

        context.Result = new ResponseMessageResult(response);

        return Task.FromResult(0);
    }
}

и в разделе конфигурации WebAPI (public static void Register(HttpConfiguration config)) напишите:

config.Services.Replace(typeof(IExceptionHandler), new APIErrorHandler());