使用ASP.net WEB API进行事务处理

7
我知道ASP.NET WEB API是为了帮助实现轻量级的基于REST的应用程序。然而,我需要我的REST服务能够进行事务处理/成为事务的一部分。我尝试过寻找相关信息,但似乎没有办法将WEB API作为客户端发起的事务的一部分。是否有方法可以实现这一点?
问候, Jagadish

你认为什么是事务?是一般的工作单元吗?还是DbTransaction或者SqlTransaction - jrummell
我正在考虑使用DTC来管理事务,但看起来WEB API不支持它。 - user1496864
4个回答

12
如果您控制电线的两端,就可以实现您想要的目标。 TransactionInterop类存在是为了支持在进程边界之间处理事务,利用MS DTC。
它包含两个对您的情况有趣的方法:
- GetTransmitterPropagationToken - 这获取一个令牌,可用于将事务传播到当前进程之外。 - GetTransactionFromTransmitterPropagationToken - 这需要传播令牌并使用它在本地服务中构建事务。
你可以在客户端使用第一种方法来生成交易。你可以将其设置为自定义标题值或cookie以传递给服务。一旦到达服务端,你可以使用第二种方法在本地创建交易。
主要的注意事项是,MS DTC需要在客户端和服务器上启用和配置。只有在Windows Active Directory域内调用服务时才能实现这一点。

一个稍微更深入的关于此的文章:https://code.msdn.microsoft.com/Distributed-Transactions-c7e0a8c2 - Jeff B

4
将服务调用列入事务通常被认为是SOAP行为而不是REST行为。至少在SOAP中有一种称为WS-AtomicTransaction的标准方法来实现它。
由于面向SOAP,ASP.Net Web API并未明确支持此功能,但WCF支持它。

http://msdn.microsoft.com/en-us/library/ms730266

您可以在REST中自己实现类似的行为,但要可靠地完成相对复杂。


"但是要可靠地实现它相对复杂。" - 如果我们想要实现它,您有什么想法? - user1496864

4
我相信你指的是通过MSDTC传播到服务边界的分布式事务。
然而,通过WCF RESTful服务进行分布式事务是不可能的,因为没有办法通过普通的HTTP请求传播和管理事务状态。
您可以考虑使用纯WCF服务,通过HTTP(wsHttpBinding)或TCP/IP(net.tcp),甚至查看WCF数据服务

2

分布式 WEB API 事务(跨应用程序域)

为了使我的 ASP.NET WEB API 支持事务或成为事务的一部分(通过 MSDTC 传播到服务边界),我实现了一个 Web API 的 Action Filter,该过滤器获取 客户端请求发送的事务标记 并将其用于 在相同客户端范围事务中注册服务事务

可以简单地将此过滤器应用于 Web API 操作:

[HttpPost] 
[EnlistToDistributedTransactionActionFilter] 
public HttpResponseMessage Post(string id) 
{
   ...
}

客户端应用程序只需打开事务并将其传递到请求中:

using (var scope = new TransactionScope()) 
{
    using (var client = new HttpClient()) 
    { 
        using (var request = new HttpRequestMessage(HttpMethod.Post, "https://acme.com/api/order", id))) 
        { 
            // extension method that forward transaction token to Web API
            request.AddTransactionPropagationToken(); 
            var response = client.SendAsync(request).Result; 
            response.EnsureSuccessStatusCode(); 
        } 
    }
}

更多详细信息、示例和源代码,请访问此处: https://www.c-sharpcorner.com/article/distributed-transactions-with-webapi-across-application-domains/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接