【问题标题】: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?> ....