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

标签 c# asp.net-mvc async-await

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

相关文章:

c# - 连接后如何测试TCPClient连接断开?

c# - 如何使用 C# 发送没有 ATT00001.bin 文件的嵌入图像电子邮件

c# - 如何允许 IIS 使用 ASP.NET MVC 项目中的本地数据库?

c# - Task.WhenAll() - 它会创建一个新线程吗?

c# - 我应该在类中使用 Field 还是 Property 来设置值

c# - Queue.Peek 线程安全吗?

c# - 如何编辑asp.net项目的dll文件方法

asp.net-mvc - Fontello 图标未显示在 Azure Web 应用程序中

javascript : Async/await in . 替换

javascript - 带有异步和等待 react native 的箭头功能