REST WCF服务中的事务

REST WCF服务中的事务,wcf,rest,transactions,wcf-rest,Wcf,Rest,Transactions,Wcf Rest,我们正在使用REST WCF服务。 我们希望此REST服务上的保存操作处于事务中。 有没有一种方法可以通过连接将事务对象传递到REST WCF服务?WCF中的事务支持是通过众多WS-*标准中的一种来处理的,这些标准只适用于SOAP—我非常怀疑webHttpBinding本身是否支持事务 不过,您可能需要检查WCF REST之上的层 请参阅ADO.NET DataServices团队提供的有关此问题的详细信息 马克(Marc)这里引用了罗伊·菲尔丁(Roy Fielding)的一句话,他是“休息”

我们正在使用REST WCF服务。 我们希望此REST服务上的保存操作处于事务中。
有没有一种方法可以通过连接将事务对象传递到REST WCF服务?

WCF中的事务支持是通过众多WS-*标准中的一种来处理的,这些标准只适用于SOAP—我非常怀疑webHttpBinding本身是否支持事务

不过,您可能需要检查WCF REST之上的层

请参阅ADO.NET DataServices团队提供的有关此问题的详细信息


马克(Marc)

这里引用了罗伊·菲尔丁(Roy Fielding)的一句话,他是“休息”一词的发明者

如果你发现自己需要一个 分布式事务协议,然后 你怎么可能说你的 架构是基于REST的吗?我 根本看不出你能从中得到什么 使用RESTful的一种情况 客户端和服务器上的应用程序状态 确定所有状态的超媒体 过渡)到的下一种情况 需要分布式协议 事务语义,其中 客户端必须告诉服务器如何 管理自己的资源

现在我考虑“休息交易”。 这是一个矛盾修饰法


这是2009年6月9日REST讨论列表中的一篇文章。

以下是关于该主题的最新讨论:

基本上它是这样说的:单个请求不支持事务,支持它们也没有意义,因为单个POST/PUT/DELETE请求只涉及一个实体和CUD操作。但可以通过以下方式在服务器端实现事务:

  • 使用批处理请求(一个完整的POST/PUT/DELETE请求包通过一个步骤从客户端发送到服务器)
  • 并利用处理管道(在处理事件中开始事务,并在已处理事件中提交/回滚事务)

我基本上同意达雷尔回答中引用的罗伊·菲尔丁的观点。您永远不应该通过RESTful web服务公开应用程序管道(如数据库事务)。但是,您可以以更实用的方式处理分布式事务

假设您正在实施一个销售点系统,可以收集购物礼品券。客户应该能够将礼品券与信用卡付款相结合。礼品券和信用卡支付都由销售点外部的系统处理。领取礼券和用信用卡付款应该是一项原子交易。为了让事情变得简单,让我们关注一个案例:客户将首先领取礼券,然后用信用卡支付剩余金额。信用卡支付可能会失败,因此您还希望在发生这种情况时回滚礼券收集

礼品券服务公开用于启动收藏的URL:

/gift-voucher/{gift-voucher-id}/collection
请求此URL将创建并保留礼品券的预订。该响应包含预订的URL:

/gift-voucher/{gift-voucher-id}/collection/reservation/${reservation-id}
此URL可以过帐或删除,以便分别执行或取消礼品券收集


请注意,此方法仅适用于存在回滚交易的功能用例(即失败的信用卡支付)的应用程序服务。尝试将此应用于较低级别的服务(如实体服务)可能会涉及大量工作,并且执行效果非常糟糕。在这种情况下,您可能想知道RESTful服务是否真的是最佳选择。

好的,那么Fielding应该解释(很明显,这本身就是一项任务)我应该如何告诉服务器:创建这两个资源,但同时,不要先创建这个资源,然后是另一个resource.POST/MyResourcePairs我会给你一个更真实的例子,但是你会发现在大多数需要发生事务的情况下,用户使用一个名词来表示该事件。因此,从最终用户的角度来看,您所描述的内容很少存在,换句话说,它将违反无状态约束。