我正在使用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.Contrib.WebApi nuget包已修复了这些问题。
我不确定我是否遗漏了别的东西。
任何人都可以帮我解决这个问题吗?
答案 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