c# - WebAPI 全局异常处理

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

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

当我将属性添加到我的 Controller (或基本 Controller )时,没有任何记录。我做错了什么?

编辑:我的 Controller 抛出异常:

[HttpGet]
public string Hello(string name)
{
    if (name.Equals("error", StringComparison.OrdinalIgnoreCase))
    {
        throw new HttpResponseException(HttpStatusCode.InternalServerError);
    }
    else
    {
        return name;
    }
}

最佳答案

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

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

无论如何,也许您需要切换到实现一个IExceptionHandler 并将其配置如下:

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

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

关于c# - WebAPI 全局异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32758467/

相关文章:

c# - 在 C# 中使用有限数量的作业和有限数量的事件线程进行线程化

c# - 当应用于大量数据时,SQL CLR 聚合无法正确终止

c# - 两个列表框,一个在 javascript 中的选择

c# - 数据集排序

c# - 在 .net web api 属性路由中的 Controller 级别使用 Route 而不是 RoutePrefix

asp.net-web-api - 在 dotnet core web API 中接收多部分表单数据

c# - 为什么要使用 Expression<Func<T>> 而不是 Func<T>?

c# - 为什么 C# ArrayList 没有 Resize 方法?

asp.net - 在符合 FDCC 的工作站上进行 VS 开发

c# - 简单注入(inject)器依赖解析错误 - 无法加载文件或程序集 System.Web.Http