我了解 ASP.NET WEB API 旨在帮助实现基于 REST 的轻量级应用程序。但是,我需要我的 REST 服务是事务性的/成为事务的一部分。我试着环顾四周,但似乎没有办法将 WEB API 作为客户端发起的事务的一部分。有没有办法做到这一点?
问候贾加迪什
我了解 ASP.NET WEB API 旨在帮助实现基于 REST 的轻量级应用程序。但是,我需要我的 REST 服务是事务性的/成为事务的一部分。我试着环顾四周,但似乎没有办法将 WEB API 作为客户端发起的事务的一部分。有没有办法做到这一点?
问候贾加迪什
如果你控制了电线的两端,就有可能达到你想要的。
TransactionInterop类的存在是为了支持使用 MS DTC 在进程边界之间处理事务。
它包含两种对您的场景感兴趣的方法:
GetTransmitterPropagationToken
- 这将获得一个令牌,可用于在当前进程之外传播事务。
GetTransactionFromTransmitterPropagationToken
- 这需要一个传播令牌并使用它在本地服务中构建事务。
您可以在客户端中使用第一种方法来生成交易。您可以将其设置为自定义标头值或 cookie 以将其传递给您的服务。一旦在服务上,您可以使用第二种方法在本地创建事务。
对此的主要警告是,需要在客户端和服务器上启用和配置 MS DTC。只有在 Windows Active Directory 域中调用您的服务时,才能真正实现这一点。
在事务中登记服务调用通常被认为是 SOAP 行为而不是 REST 行为。至少有一种标准化的方式来处理 SOAP,称为 WS-AtomicTransaction。
由于面向 SOAP,ASP.Net Web API 没有明确支持,但 WCF 支持
http://msdn.microsoft.com/en-us/library/ms730266
在 REST 中自己实现类似的类似行为是可能的,但可靠地执行相对复杂。
我相信您指的是可以跨服务边界传播的分布式事务(通过 MSDTC)。
但是,不可能通过 WCF RESTful 服务进行分布式事务,因为根本无法通过普通 HTTP 请求传播和管理事务状态。
您可能想通过 HTTP (wsHttpBinding) 或 TCP/IP (net.tcp) 查看普通的 WCF 服务,或者甚至查看WCF 数据服务。
使用 WEB API 的分布式事务(跨应用程序域)
为了让我的 ASP.NET WEB API 跨国或事务的一部分(通过 MSDTC 在服务边界上传播),我实现了一个 Web API 的操作过滤器,它检索客户端请求发送的事务令牌并使用它来注册服务事务在同一个客户范围的事务中。
此过滤器可以简单地应用于 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/