2015-04-10 2 views
1

Я использую Web API 2.1 и пытаюсь зарегистрировать все необработанные исключения, используя ELMAH. Я пытаюсь регистрировать ошибки для следующих случаев:Elmah.Contrib.WebApi не регистрирует исключения маршрутизации для Web API 2

  1. Исключения, выброшенные из конструкторов контроллера.
  2. Исключения, брошенные из обработчиков сообщений.
  3. Исключения, брошенные во время маршрутизации.
  4. Исключения, возникающие при сериализации содержимого ответа.

Я следил за приведенными ниже ссылками, чтобы регистрировать все необработанные исключения. http://jasonwatmore.com/post/2014/05/03/Getting-ELMAH-to-catch-ALL-unhandled-exceptions-in-Web-API-21.aspx

http://blog.elmah.io/logging-to-elmah-io-from-web-api/

У меня есть контроллер:

TestController.cs

public class TestController : ApiController 
    { 
     private IMessageProvider _messageProvider; 
     private INewMessageProvider _newMessageProvider; 
     public TestController(IMessageProvider messageProvider, INewMessageProvider newMessageProvider) 
     { 
      _messageProvider = messageProvider; 
      _newMessageProvider = newMessageProvider; 
     } 


     public object Get() 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.BadRequest,"Error in processing the webapi"); 
     } 

     [HttpGet] 
     **[Route("api/test/{namee}")]** 
     public HttpResponseMessage GetNewMessageByName(string name) 
     { 
      if (string.IsNullOrWhiteSpace(name)) 
      { 
       return Request.CreateErrorResponse(HttpStatusCode.BadRequest,"Name parameter cannot be empty"); 
      } 

      //int i = 1, j = 0; 

      //int k = i/j; 

      return Request.CreateResponse(HttpStatusCode.OK, _newMessageProvider.GetNewMessage() + name); 
     } 

Global.asax.cs

using Elmah.Contrib.WebApi; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Http; 
using System.Web.Http.ExceptionHandling; 

namespace DemoStructureMapWebAPI 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Web API configuration and services 



      // Web API routes 
      config.MapHttpAttributeRoutes(); 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

      config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger()); 


     } 
    } 
} 

Теперь я пытаюсь проверить маршрут : http://localhost:62145/api/test/testnewname и я вижу ошибку ниже:

<Error> 
<Message> 
No HTTP resource was found that matches the request URI 'http://localhost:62145/api/test/testnewname'. 
</Message> 
<MessageDetail> 
No action was found on the controller 'Test' that matches the request. 
</MessageDetail> 
</Error> 

Там несоответствие в параметре маршрута: namee (т.е. апи/тест/{namee}) и входной параметр в метод GetNewMessageByName (строка name) Следовательно, я получаю сообщение об ошибке, но я вижу, что ошибка не регистрируется ELMAH. Я не могу видеть ошибку в журналах ELMAH. В соответствии с приведенными выше статьями кажется, что пакет Elmah.Contrib.WebApi nuget исправил проблемы.

Я не уверен, что мне не хватает чего-то другого.

Может ли кто-нибудь помочь мне исправить эту проблему?

ответ

2

Оказалось, что ошибки 404 обрабатываются по-разному в веб-API, они обходят обычный конвейер запросов и отправляются непосредственно в браузер, прежде чем ELMAH ничего о них знает.

Таким образом, чтобы регистрировать 404 ошибки с помощью ELMAH, вам необходимо добавить маршрут «поймать все» в качестве последнего маршрута в вашем WebApiConfig, чтобы вручную регистрировать ошибки.

Я только что обновил свой блог и включен рабочий пример решения, которое будет ловить все ошибки, включая 404-х - http://jasonwatmore.com/post/2014/05/03/Getting-ELMAH-to-catch-ALL-unhandled-exceptions-in-Web-API-21.aspx

+0

Большое спасибо за ваш ответ. Это очень полезно :) –