我有一个ASP WebAPI项目。我正试图在我的basecontroller上设置一个全局异常处理程序。所以我创建了一个像这样的ExceptionFilterAttribute。
using System.Web.Http.Filters;
public class MyExceptionFilterAttribute : ExceptionFilterAttribute
{
protected static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
var exception = actionExecutedContext.Exception;
log.Fatal(exception);
base.OnException(actionExecutedContext);
}
}然后我也在/App_Start/WebApiConfig.cs上注册了
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// ...
// Setup Filters
config.Filters.Add(new MyExceptionFilterAttribute());
}
}当我将属性添加到控制器(或基本控制器)中时,不会记录任何内容。我做错了什么?
编辑:我的控制器抛出异常:
[HttpGet]
public string Hello(string name)
{
if (name.Equals("error", StringComparison.OrdinalIgnoreCase))
{
throw new HttpResponseException(HttpStatusCode.InternalServerError);
}
else
{
return name;
}
}发布于 2015-09-24 14:05:37
正如@ShekharPankaj所指出的,并非所有例外都由属性(或@Matías提供的方法)处理。我的密码很好。我简单地将异常更改为ArgumentException,然后对其进行处理。
还请参见下面的SO- this:catch all unhandled exceptions in ASP.NET Web Api。
回答我自己的问题,这是不可能的! 处理所有导致内部服务器错误的异常似乎是Web API应该具备的基本功能,因此我向Microsoft提交了一个用于Web API的全局错误处理程序的请求: https://aspnetwebstack.codeplex.com/workitem/1001 如果你同意,去那个链接并投票支持它! 同时,优秀的文章ASP.NET Web异常处理展示了几种不同的捕获不同类别错误的方法。它比应该的要复杂得多,它并不能捕获所有的内部服务器错误,但它是当今可用的最佳方法。 更新:全局错误处理现在已实现,并可在夜间构建!它将在ASP.NET MVC v5.1中发布。下面是它的工作方式:https://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20Handling
发布于 2015-09-24 10:04:25
实际上,当您将该筛选器添加到您的HttpConfiguration中时,这意味着它将对任何操作执行。也就是说,不需要将整个属性添加到API控制器中。
什么可以跳过你的过滤器?其他过滤器。设置响应的第一个筛选器获胜,操作本身可能永远不会执行。
无论如何,您可能需要切换到实现IExceptionHandler并按以下方式配置它:
config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler());这种方法更好,因为它是一个真正的最后一次异常处理程序,并且它总是被独立于过滤器的行为调用。
https://stackoverflow.com/questions/32758467
复制相似问题