WebAPI全局异常处理

时间:2015-09-24 09:58:05

标签: c# asp.net asp.net-web-api exception-handling

我有一个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;
    }
}

2 个答案:

答案 0 :(得分:9)

实际上,当您将该过滤器添加到HttpConfiguration时,这意味着它将针对任何操作执行。也就是说,您不需要将整个属性添加到API控制器中。

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

无论如何,您可能需要切换到实现IExceptionHandler并按如下方式进行配置:

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

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

答案 1 :(得分:9)

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

另请参阅此SO主题:catch all unhandled exceptions in ASP.NET Web Api

  

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

     

处理导致内部服务器错误的所有异常似乎是一个   Web API应该具备的基本功能,所以我已经提出了一个请求   Microsoft用于Web API的全局错误处理程序:

     

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

     

如果您同意,请转到该链接并投票支持!

     

与此同时,出色的文章是ASP.NET Web API Exception   处理显示了一些不同的方法来捕捉一些不同的   错误类别。这比它应该更复杂,而且它   没有捕获所有内部服务器错误,但这是最好的方法   今天可用。

     

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