【问题标题】:DotnetCore : OnException method in a custom filter is called two timesDotnetCore:自定义过滤器中的 OnException 方法被调用两次
【发布时间】:2017-05-18 07:21:10
【问题描述】:

我正在使用 dotnet core 并创建了一个自定义异常过滤器来处理异常。我面临的问题是,在出现异常的情况下,自定义过滤器中的 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 会被调用两次?

【问题讨论】:

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


    【解决方案1】:

    使用 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();
        }
    }
    

    最后,我在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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      另一种可能导致这种情况的情况是在两个地方添加属性:

      我有这个:

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

      还有这个:

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

      【讨论】:

        猜你喜欢
        • 2021-07-12
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        • 2014-09-17
        • 1970-01-01
        • 1970-01-01
        • 2018-08-06
        • 2020-07-14
        相关资源
        最近更新 更多