DotnetCore:自定义过滤器中的OnException方法被调用两次

时间:2017-05-18 07:21:10

标签: exception-handling asp.net-core-mvc .net-core

我正在使用dotnet核心并创建了一个自定义异常过滤器来处理异常。我面临的问题是,在异常的情况下,自定义过滤器中的onException方法被调用两次。以下是代码:

   public class CustomExceptionFilter : ExceptionFilterAttribute
     {
            public override void OnException(ExceptionContext context)
                 {
                    // Code 
                    base.OnException(context);
                 }
     }

控制器代码是:

         [CustomExceptionFilter]   
         public class MyController : Controller
         {
             // Raise an exception in any apis
         }

为什么onException被调用两次?

2 个答案:

答案 0 :(得分:2)

使用Visual Studio我创建了一个新的Asp.Net核心Web应用程序并使用了标准的Web应用程序模板。然后我添加了CustomExceptionFilter类,并将[CustomExceptionFilter]属性添加到HomeController,并在其Index方法中抛出异常:

[CustomExceptionFilter]
public class HomeController : Controller
{

    public IActionResult Index()
    {
        throw new Exception("Time to bail!");
        return View();
    }
}

最后,我在CustomExceptionFilter

的这一行设置了一个断点
 base.OnException(context);

并运行网站。当然,调试器在throw停止,然后在断点的行上停止。断点只被击中一次。所以我的设置验证了预期的行为。

<强>疑难解答
在过去,我遇到了类似的情况,其中只应该被调用一次的东西被调用两次,而且几乎总是被证明是因为第二个http请求进入了我没想到的。所以它真的只是每个http请求被调用一次。检查方法的一种方法是查看方法中的路径和查询,如下所示:

 public class CustomExceptionFilter : ExceptionFilterAttribute {
    public override void OnException(ExceptionContext context) {

        //set breakpoing on the following line to see what the requested path and query is
        string pathAndQuery = context.HttpContext.Request.Path + context.HttpContext.Request.QueryString;

        // Code 
        base.OnException(context);
    }
}

答案 1 :(得分:0)

可能导致此问题的另一种情况是在两个位置添加属性:

我有这个:

config.Filters.Add( new StandardExceptionHandlingAttribute() );

和这个:

  [StandardExceptionHandling]
  public async Task<int?> ....