我正在使用Web API 2.1,并尝试使用ELMAH记录所有未处理的异常。我正在尝试记录以下情况的错误:
- 从控制器构造函数引发异常
- 从消息处理程序引发异常
- 路由过程中引发异常
- 响应内容序列化期间引发异常
我按照下面提到的链接记录了所有未处理的异常。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.Control.WebApi-nuget包似乎已经解决了这些问题。
我不确定我是否遗漏了什么。
有人能帮我解决这个问题吗?
在Web API中,404个错误的处理方式有点不同,它们绕过了通常的请求管道,在ELMAH知道它们之前直接发送到浏览器。
因此,为了用ELMAH记录404个错误,您需要在WebApiConfig中添加一个"catch-all"路由作为最后一个路由,以手动记录错误。
我刚刚更新了我的博客文章,并包含了一个工作示例解决方案,该解决方案将捕获所有错误,包括404-http://jasonwatmore.com/post/2014/05/03/Getting-ELMAH-to-catch-ALL-unhandled-exceptions-in-Web-API-21.aspx