Elmah.Contrib.WebApi未记录Web API 2的路由例外

时间:2015-04-10 14:53:49

标签: asp.net-web-api2 elmah

我正在使用Web API 2.1并尝试使用ELMAH记录所有未处理的异常。我正在尝试记录以下情况的错误:

  1. 从控制器构造函数抛出的异常。
  2. 从消息处理程序抛出的异常。
  3. 路由期间抛出的异常。
  4. 响应内容序列化期间抛出的异常。
  5. 我按照下面提到的链接记录所有未处理的异常。 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(即 api / test / {namee} )和方法的输入参数 GetNewMessageByName(字符串名称) 因此我收到错误,但我发现ELMAH没有记录错误。我无法在ELMAH日志中看到错误。 根据上面提到的文章,似乎Elmah.Contrib.WebApi nuget包已修复了这些问题。

    我不确定我是否遗漏了别的东西。

    任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

事实证明,在Web API中404错误的处理方式略有不同,它们会绕过通常的请求管道,并在ELMAH知道任何内容之前直接发送到浏览器。

因此,为了使用ELMAH记录404错误,您需要添加一个&#39; catch all&#39; route作为WebApiConfig中的最后一条路线,手动记录错误。

我刚刚更新了我的博文,其中包含了一个可以捕获所有错误的工作示例解决方案,包括404s - http://jasonwatmore.com/post/2014/05/03/Getting-ELMAH-to-catch-ALL-unhandled-exceptions-in-Web-API-21.aspx