什么时候执行MVC ExceptionFilter而不是应用程序级错误处理程序?

时间:2017-05-22 13:15:46

标签: c# model-view-controller asp.net-mvc-5

我有一个自定义异常FilterAttribute,如下所示:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public sealed class ExceptionLoggingFilterAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException(nameof(filterContext));
        }

        if (filterContext.ExceptionHandled)
        {
            return;
        }

        // some exception logging code (not shown)

        filterContext.ExceptionHandled = true;
}

我在FilterConfig.cs

中全局注册了这个
public static class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters?.Add(new ExceptionLoggingFilterAttribute());
    }
}

我还在我的global.asax.cs

中声明了一个Application_Error方法
protected void Application_Error(object sender, EventArgs e)
    {
        var exception = Server.GetLastError();

        // some exception logging code (not shown)
    }
  1. 什么时候会触发异常过滤器代码,什么时候会直接进入Application_Error方法中的全局错误处理程序? (我理解ExceptionHandled概念并意识到通过标记在我的过滤器中处理,它不会再级联到全局错误处理程序)。
  2. 我认为会遇到过滤器的异常 - 404的HttpException,不会触及过滤器但会被应用程序错误处理程序捕获。

    1. 我看过一些代码示例,其中人们使用global.asax.cs中的HttpContext.Current对特定的错误视图执行Server.TransferRequest。这是最佳做法吗?使用web.config的system.web部分中的CustomErrors部分会更好吗?

1 个答案:

答案 0 :(得分:1)

只会针对在执行ASP.NET MVC管道期间发生的错误命中异常过滤器,例如:在执行Action方法期间:

  

异常过滤器。这些实现IExceptionFilter并执行if   在执行期间抛出了未处理的异常   ASP.NET MVC管道。异常过滤器可用于诸如此类的任务   记录或显示错误页面。 HandleErrorAttribute类是   一个例外过滤器的例子。

(来自:https://msdn.microsoft.com/en-us/library/gg416513(VS.98).aspx

如果出现404错误,则无法确定Action方法,因此不会在过滤器中处理错误。

所有其他错误将在Application_Error方法中处理。

关于问题的第二部分,我建议使用以下博客文章,其中包含有关如何以可靠方式设置自定义错误页面的良好概述: http://benfoster.io/blog/aspnet-mvc-custom-error-pages