【问题标题】:Using Custom IHttpActionInvoker in WebAPI for TransactionScope in Async actions在 Web API 中为异步操作中的 TransactionScope 使用自定义 IHttpActionResult
【发布时间】: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


    【解决方案1】:

    您的 scope 正在完成并在控制器操作完成执行之前被处置,因为您不等待响应。试试这样吧:

    public class ControllerActionTransactionInvoker : ApiControllerActionInvoker
    {
        public override async Task<HttpResponseMessage> InvokeActionAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
        {
            using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
            {
                HttpResponseMessage result = await base.InvokeActionAsync(actionContext, cancellationToken);
                scope.Complete();
                return result;
            }
        }
    }
    

    虽然这可能行得通,但您可能还想考虑在 Web API 堆栈的更高层执行此操作 - 可能在处理程序中 - 因为您可能会错过其他事务活动,例如处理程序、过滤器等。取决于您想要的范围内和范围之外的内容。

    【讨论】:

    • 嗨,这在本地工作。我稍后也会检查 Azure。非常感谢!
    猜你喜欢
    • 2018-12-17
    • 1970-01-01
    • 2021-09-02
    • 2016-12-20
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多