异常处理ASP.NET MVC的Web API(Exception Handling ASP.NET

2019-06-23 20:51发布

我会的,是的,我们已经建立并正在使用的异常过滤器从ExceptionFilterAttribute继承开始。 它是注册在应用程序启动时的配置我们的身份过滤后马上工作,如果我们的API内部某处发生错误预期差不多。

话虽这么说,我正在寻找一种方法来处理这种情况发生到达API之前的错误。

推理:我们从来没有要返回YSOD和/或IIS HTML错误。 我们总是想打一个自定义异常过滤器/处理器,以便我们能够正确处理记录,并返回一个JSON响应用户。

截至目前,使用招提出请求,我可以附加到w3wp.exe的过程,看到了要求打在Global.asax中的Application_BeginRequest方法。 在此之后,它只是返回一个500响应。 它从来没有在代码中断与异常或后击中我的任何破发点。 这似乎是返回一个错误IIS。 我们不希望这种情况发生。 我们需要捕获所有这些“低级”的例外,记录它们,并且返回一些有意义的事给用户的能力。

有什么我们可以做前处理错误,似乎是击中ASP.NET MVC的Web API代码呢?

Answer 1:

虽然我喜欢Darin的答案是不,因为ASP.NET MVC的Web API框架我们的情况下工作抑制/内部,而不是处理异常重新抛打在Global.asax Application_Error事件。 我们的解决方案是这样的。

我结束了创建像这样的自定义DelegatingHandler:

public class PrincipalHandler : DelegatingHandler
{
    protected const string PrincipalKey = "MS_UserPrincipal";
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        setAnonymousPrincipal();

        request = InitializeIdentity(request);

        return base.SendAsync(request, cancellationToken)
            .ContinueWith(r =>
                              {
                                  // inspect result for status code and handle accordingly
                                  return r.Result;
                              });
    }
}

然后我插入HttpConfiguration,以确保它是被打的第一个/最后一个处理程序。 处理程序的Web API中的工作方式是在一个分层的方式。 因此,要每个请求被击中的第一个处理程序,将在回应被打的最后一个处理。 至少这是我的理解,有人随时纠正我,如果我错了。

public static void ConfigureApis(HttpConfiguration config)
{
    config.MessageHandlers.Insert(0, new PrincipalHandler());
}

通过使用这种方法,我们现在可以检查每个结果回来从网上API和控制器任何回应。 这使我们能够处理可能需要发生的,因为我们希望在返回的东西而产生的任何记录。 现在,我们还可以改变回来,使IIS不插入任何默认的HTML错误页面,如果它认为某些HTTP状态代码响应的内容。

我有这一点,我希望他们改变它在即将到来的网络API的版本唯一的问题是,他们没有发出异常备份的任务从base.SendAsync返回()。 因此,我们必须去通过的唯一信息是HTTP状态代码,并尽最大的努力给予合理的或可能的答案给消费者。



文章来源: Exception Handling ASP.NET MVC Web API