【发布时间】:2016-12-12 15:56:00
【问题描述】:
我想为每个异步控制器操作应用 TransactionScope。我不想在每个动作中都这样做,而是想在一个中心位置进行,以便它适用于所有动作。我尝试创建一个继承自 ApiControllerActionInvoker 的自定义 IHttpActionInvoker
public class ControllerActionTransactionInvoker : ApiControllerActionInvoker
{
public override Task<HttpResponseMessage> InvokeActionAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
{
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
Task<HttpResponseMessage> result;
result = base.InvokeActionAsync(actionContext, cancellationToken);
scope.Complete();
return result;
}
}
}
然后在 Web Api 的 Startup 类中用新创建的 IHttpActionInvoker 替换默认的 IHttpActionInvoker
config.Services.Replace(typeof(IHttpActionInvoker), new ControllerActionTransactionInvoker());
现在,我可以调用控制器操作并获取结果,但是我手动引发了一系列 Db 操作的异常,并且所需的 Transaction 过程不起作用。所以在 DB 中完成了部分工作。 在 Azure api 应用程序中托管 api 后,它根本不起作用。它说找不到控制器操作。
如何解决?
【问题讨论】:
标签: c# azure async-await asp.net-web-api2 transactionscope