我创建了一个自定义过滤器属性来扩展 HandleErrorAttribute
,它可以捕获所有异常。
我的整个应用程序是围绕整个堆栈的异步架构构建的。
这意味着,我必须以某种方式使用 OnException(ExceptionContext contect)
异步重写。像这样的事情,就是我想象的那样(为了可读性而简化):
public async override void OnException(ExceptionContext context)
{
base.OnException(context);
var logId = await LogException(e, httpContext); //LogException calls an async method and returns the ID of the exception, after it has been saved to the database. I this ID in the filterContext, which is why I need the result of the method
}
但是,这会导致InvalidOperationException:此时无法启动异步操作。异步操作只能在异步处理程序或模块内启动,或者在页面生命周期中的某些事件期间启动。
。
我不能在同步调用时简单地调用任务上的 .Result,因为这会导致死锁。
所以我想我的问题是:如何在 MVC5 中创建一个可以异步记录错误的过滤器?
最佳答案
由于错误处理通常不是热代码,因此这里不存在性能问题。因此,请做对您来说最方便的事情。
例如,您可以阻止从 LogException
返回的任务。有多种方法可以可靠地避免死锁。一个简单的方法是 Task.Run(() => LogException()).Wait();
。这是可行的,因为任务主体在没有同步上下文的情况下运行。
您还可以在 LogException
内部添加 ConfigureAwait(false)
,但您不能错过任何一个地方。这使得它变得脆弱。
关于c# - MVC 5 过滤器中的异步错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40216535/