2009-09-07 108 views
10

我们正在使用REST WCF服务。 我们希望此REST服务的保存操作处于事务中。 有没有办法通过电线将事务对象传递给REST WCF服务?REST WCF服务中的事务

回答

13

这里是罗伊·菲尔丁,谁发明了术语REST

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

......现在我认为“休息交易” 是一个矛盾。

这是从6月9日的REST的讨论列表上的message,2009年

+0

好的,所以Fielding应该解释(清楚地说,这是一个任务本身),我该如何告诉服务器:创建这两个资源,但同时,不是先创建这个资源,而是这个其他资源。 – 2009-11-04 00:46:35

+3

POST/MyResourcePairs 我给你一个更真实的例子,但你会发现,在大多数情况下,事务需要发生,有一个名词用户用来引用该事件。因此,从最终用户的角度来看,你所描述的很少存在。 – 2009-11-04 01:54:12

+0

换句话说,它会违反无状态约束。 – inf3rno 2015-10-12 11:17:41

1

WCF中的事务处理支持是通过许多WS- *标准之一处理的,而这些标准只适用于SOAP--我非常怀疑webHttpBinding本身将支持事务。

但是,您可能想要检查ADO.NET Dataservices,它们是WCF REST之上的图层。

请参阅ADO.NET DataServices团队的blog post

马克

0

这里的话题最近的讨论:http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/e66651c0-9202-4049-a8f4-55971b8b359d

基本上它说:一个请求不支持事务并且支持它们是没有意义的,因为在一个POST/PUT/DELETE请求中只涉及一个实体和CUD操作。

  • 使用批处理请求(在一个步骤中被发送POST的整束/ PUT/DELETE请求从客户机到服务器)
  • 和利用处理:但是事务可以在服务器侧通过来实现管道(在处理事件开始事务并提交/在加工事件回滚事务)
2

我大多同意罗伊菲尔丁在达雷尔的回答引用。您绝对不应该通过REST风格的Web服务公开应用程序管道,例如数据库事务。但是,您可以以更实用的方式处理分布式事务。

假设您正在实施可以收集购物礼券的销售点系统。客户应该能够将礼券与信用卡付款结合起来。礼券和信用卡付款均由销售点外部的系统处理。收集礼券和进行信用卡付款应该是原子交易。为了让事情变得简单,让我们关注一个案例:客户首先会收集礼券,并用信用卡支付余额。信用卡支付可能会失败,因此您还想在此情况下回滚礼券凭证。

礼券服务公开的URL发起集合:

/gift-voucher/{gift-voucher-id}/collection 

请求这个URL将创建并持续礼券预订。响应包含一个URL,以保留:

/gift-voucher/{gift-voucher-id}/collection/reservation/${reservation-id} 

这个URL可以是张贴或删除,以便分别执行或取消的礼品券集合。

请注意,此方法只能用于有功能用例回滚事务(即失败的信用卡付款)的应用程序服务。试图将此应用于实体服务等较低级别的服务可能涉及大量工作并且性能可怕。在这种情况下,您可能想知道RESTful服务是否真的是最佳选择。