首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebAPI全局异常处理

WebAPI全局异常处理
EN

Stack Overflow用户
提问于 2015-09-24 09:58:04
回答 2查看 36.4K关注 0票数 18

我有一个ASP WebAPI项目。我正试图在我的basecontroller上设置一个全局异常处理程序。所以我创建了一个像这样的ExceptionFilterAttribute

代码语言:javascript
复制
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上注册了

代码语言:javascript
复制
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // ...

        // Setup Filters
        config.Filters.Add(new MyExceptionFilterAttribute());
    }
}

当我将属性添加到控制器(或基本控制器)中时,不会记录任何内容。我做错了什么?

编辑:我的控制器抛出异常:

代码语言:javascript
复制
[HttpGet]
public string Hello(string name)
{
    if (name.Equals("error", StringComparison.OrdinalIgnoreCase))
    {
        throw new HttpResponseException(HttpStatusCode.InternalServerError);
    }
    else
    {
        return name;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

票数 12
EN

Stack Overflow用户

发布于 2015-09-24 10:04:25

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

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

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

代码语言:javascript
复制
config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler());

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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32758467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档