【问题标题】:WebAPI Global Exception HandlingWebAPI 全局异常处理
【发布时间】:2015-12-21 21:16:30
【问题描述】:

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

【问题讨论】:

  • 你错过了什么类型的异常,过滤器无法处理的情况有很多。

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


【解决方案1】:

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

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

不管怎样,也许你需要切换实现一个IExceptionHandler,并配置如下:

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

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

【讨论】:

  • 我喜欢这种方法,但它也适用于非异步方法吗?我需要实现的唯一方法是Task HandleAsync()
  • @Thijs 是的,它绝对是全球性的
  • 因为我抛出异常时调试器没有进入方法。
  • @Thijs 尝试继承这个类msdn.microsoft.com/en-us/library/…并覆盖同步的Handle...
  • @Thijs 按照本教程检查您是否以正确的方式完成了所有操作:asp.net/web-api/overview/error-handling/…
【解决方案2】:

就像@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多