处理异步 MVC 操作中的事务

Handling transactions in asynchronous MVC actions

我想知道在异步 MVC 操作中处理事务的 good/safe 方法是什么。特别是 MSMQ 事务。我目前正在使用一个动作过滤器在同步动作中处理它们,该动作过滤器在 OnActionExecuting 中创建事务对象,将其保存到静态 class 中的线程本地存储,然后提交(如果适用)并销毁 OnActionExecuted 中的事务。

我猜在这里使用 TLS 会在异步操作中崩溃。

除了将事务实例传递给每个方法调用之外,是否有 good/robust 方法在异步操作中完成此操作?

我想(我还没有测试过)System.Web.Mvc.IActionFilterOnActionExecuting/OnActionExecuted 仍然在异步 MVC 操作的开始和结束时被调用,很像同步操作.

如果这是真的,只需在 OnActionExecuting 处使用 CallContext.LogicalSetData 并在 OnActionExecuted 处使用 CallContext.LogicalGetData 而不是 described by Stephen Cleary in his blog 中的 TLS。您的事务状态将在 await 延续时跨线程流动。