WebAPI全局异常处理

本文关键字:异常处理 全局 WebAPI | 更新日期: 2023-09-27 18:14:16

我有一个ASP WebAPI项目。我试图在我的基本控制器上设置一个全局异常处理程序。所以我创建了一个这样的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;
    }
}

WebAPI全局异常处理

实际上,当你添加过滤器到你的HttpConfiguration,这意味着它将被执行任何行动。也就是说,你不需要把整个属性添加到你的API控制器中。

什么可以跳过你的过滤器?其他过滤器。设置响应的第一个过滤器获胜,并且操作本身可能永远不会执行。

无论如何,也许您需要切换到实现IExceptionHandler并按如下方式配置它:

config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler());

这种方法更好,因为它是一个真正的最后机会异常处理程序,它将始终独立于过滤器的行为被调用。

就像@ShekharPankaj指出的那样,并非所有异常都由属性(或@Matías提供的方法)处理。我的代码没问题。我简单地将异常更改为ArgumentException,它得到处理。

参见SO-thread: catch ASP中所有未处理的异常。. NET Web Api

回答我自己的问题,这是不可能的!

处理所有导致内部服务器错误的异常似乎是一个错误Web API应该具有的基本功能,因此我在请求中添加了Microsoft for Web API的全局错误处理程序:

https://aspnetwebstack.codeplex.com/workitem/1001

如果你同意,就去那个链接投票吧!

在此期间,优秀的文章ASP。. NET Web API异常处理显示了几种不同的方法来捕获一些不同的错误的分类。这比它应该的要复杂得多,而且不能捕获所有内部服务器错误,但这是最好的方法今天可用的。

更新:全局错误处理现已实现,并可在每夜构建!它将以ASP发布。. NET MVC v5.1。它是这样的将工作:https://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20Handling