gpt4 book ai didi

c# - 在异步操作中的 TransactionScope 的 WebAPI 中使用自定义 IHttpActionInvoker

转载 作者:行者123 更新时间:2023-12-03 03:09:09 25 4
gpt4 key购买 nike

我想为每个异步 Controller 操作应用 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());

现在,我可以调用 Controller 操作并获取结果,但我手动引发了一系列数据库操作的异常,并且所需的事务过程不起作用。所以在数据库中完成了部分工作。并且在Azure api应用程序中托管api后根本不起作用。它说找不到 Controller 操作。

如何解决这个问题?

最佳答案

您的范围正在 Controller 操作完成执行之前完成并被处置,因为您不等待响应。尝试像这样:

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 堆栈的更高层(也许在处理程序中)执行此操作,因为您可能会错过其他事务事件,例如处理程序、过滤器等。取决于您想要的范围内和范围外的内容。

关于c# - 在异步操作中的 TransactionScope 的 WebAPI 中使用自定义 IHttpActionInvoker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41104631/

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