我们正在使用REST WCF服务。 我们希望此REST服务上的保存操作处于事务中。 有没有办法通过线路将Transaction对象传递给REST WCF服务?
答案 0 :(得分:13)
以下是Roy Fielding的一句话,他发明了术语REST
如果你发现自己需要一个 然后是分布式事务协议 你怎么可能说你的 架构基于REST?一世 根本无法看到你如何得到 一种情况(使用RESTful 客户端和应用程序状态 超媒体确定所有状态 过渡到下一个情况 需要分发协议 事务语义中的 客户端必须告诉服务器如何 管理自己的资源。
...现在我认为“休息交易” 成为矛盾的人。
这是来自2009年6月9日的REST讨论列表中的message。
答案 1 :(得分:2)
我大多同意在达雷尔的回答中引用的罗伊菲尔丁。您永远不应该通过RESTful Web服务公开数据库事务之类的应用程序管道。但是,您可以以更实用的方式处理分布式事务。
假设您正在实施可以收集购物礼券的销售点系统。客户应该能够将礼券与信用卡付款相结合。礼券和信用卡付款均由销售点外部的系统处理。收集礼券并进行信用卡付款应该是一种原子交易。为了方便起见,让我们关注一个案例:客户将首先收集礼券,并使用信用卡支付剩余金额。信用卡付款可能会失败,因此您还希望在发生这种情况时回滚礼品券集合。
礼品券服务公开了一个用于启动收集的URL:
/gift-voucher/{gift-voucher-id}/collection
请求此URL将创建并保留礼券的预订。响应包含预订的URL:
/gift-voucher/{gift-voucher-id}/collection/reservation/${reservation-id}
此URL可以是POST或DELETEd,以分别执行或取消礼券收集。
请注意,此方法仅适用于存在功能用例以回滚事务(即信用卡付款失败)的应用程序服务。试图将此应用于实体服务等较低级别的服务可能会涉及大量工作并且表现可怕。在这种情况下,您可能想知道RESTful服务是否真的是最佳选择。
答案 2 :(得分:1)
WCF中的事务支持是通过许多WS- *标准之一来处理的,而那些仅适用于SOAP - 我非常怀疑webHttpBinding本身是否支持事务。
您可能想要检查ADO.NET Dataservices,这是WCF REST之上的一层。
请参阅ADO.NET DataServices小组关于此的blog post。
马克
答案 3 :(得分:0)
以下是有关该主题的最新讨论:http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/e66651c0-9202-4049-a8f4-55971b8b359d
基本上它说:单个请求不支持事务,并且支持它们没有意义,因为在单个POST / PUT / DELETE请求中只涉及一个实体和CUD操作。但是事务可以通过以下方式在服务器端实现: