我正在使用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被调用两次?
答案 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?> ....