我们有一个REST WCF服务,希望在其中的保存操作处于事务中。 是否有一种方法可以将Transaction对象通过网络传递到REST WCF服务?
我们有一个REST WCF服务,希望在其中的保存操作处于事务中。 是否有一种方法可以将Transaction对象通过网络传递到REST WCF服务?
以下是罗伊·菲尔丁(Roy Fielding)的一段话,他发明了 REST 这个术语:
如果你发现自己需要一个分布式事务协议,那么你怎么可能说你的架构是基于 REST 的呢?我根本看不出你如何从一种情况(在客户端使用 RESTful 应用程序状态和超媒体来确定所有状态转换)到另一种情况(需要分布式同意事务语义,在其中客户端必须告诉服务器如何管理其自身资源)。
... 目前我认为“rest transaction”是一个自相矛盾的说法。
这段话摘自2009年6月9日REST-discuss列表中的一条消息。
/gift-voucher/{gift-voucher-id}/collection
请求此URL将创建并持久化礼品券的预订。响应包含一个指向预订的URL:
/gift-voucher/{gift-voucher-id}/collection/reservation/${reservation-id}
这个URL可以被POST或DELETE以分别执行或取消礼品券的收集。
请注意,此方法仅适用于应用程序服务,在其中有功能用例可回滚事务(例如失败的信用卡付款)。尝试将其应用于实体服务等较低级别的服务可能涉及大量工作并表现不佳。在这种情况下,您可能会想知道RESTful服务是否真的是最佳选择。
WCF中的事务支持是通过众多WS-*标准之一来处理的,而这些标准仅适用于SOAP - 我非常怀疑webHttpBinding将会直接支持事务。
不过,您可能需要查看一下ADO.NET数据服务,它们是建立在WCF REST之上的一层。
请参阅ADO.NET DataServices团队的博客文章。
Marc
这里有一个关于该主题的最新讨论:http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/e66651c0-9202-4049-a8f4-55971b8b359d
基本上它说:单个请求不支持事务,并且支持它们没有意义,因为在单个POST / PUT / DELETE请求中仅涉及一个实体和CUD操作。但是可以通过以下方式在服务器端实现事务: