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

Sun*_*ilA 5 exception asp.net-core-mvc .net-core

我正在使用 dotnet core 并创建了一个自定义异常过滤器来处理异常。我面临的问题是,如果出现异常,自定义过滤器中的 onException 方法会被调用两次。下面是代码:

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

控制器代码是:

         [CustomExceptionFilter]   
         public class MyController : Controller
         {
             // Raise an exception in any apis
         }
Run Code Online (Sandbox Code Playgroud)

为什么 onException 会被调用两次?

Ron*_*n C 5

我使用 Visual Studio 创建了一个新的 Asp.Net Core Web 应用程序并使用了标准 Web 应用程序模板。然后我添加了该类CustomExceptionFilter,并将[CustomExceptionFilter]属性添加到了HomeController它的方法中并引发了异常Index

[CustomExceptionFilter]
public class HomeController : Controller
{

    public IActionResult Index()
    {
        throw new Exception("Time to bail!");
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我在以下行中设置了一个断点CustomExceptionFilter

 base.OnException(context);
Run Code Online (Sandbox Code Playgroud)

并运行了该网站。调试器停在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);
    }
}
Run Code Online (Sandbox Code Playgroud)