gpt4 book ai didi

c# - MVC 5 过滤器中的异步错误处理

转载 作者:太空宇宙 更新时间:2023-11-03 23:08:44 26 4
gpt4 key购买 nike

我已经创建了一个自定义过滤器属性来扩展 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com