REST WCF 服务中的事务
Posted
技术标签:
【中文标题】REST WCF 服务中的事务【英文标题】:Transaction in REST WCF service 【发布时间】:2010-11-26 06:26:41 【问题描述】:我们有一个 REST WCF 服务。 我们希望此 REST 服务上的保存操作在事务中。 有没有办法通过线路将 Transaction 对象传递给 REST WCF 服务?
【问题讨论】:
【参考方案1】:WCF 中的事务支持是通过众多 WS-* 标准之一处理的,这些标准仅适用于 SOAP - 我非常怀疑 webHttpBinding 本身是否会支持事务。
不过,您可能想查看ADO.NET Dataservices,它是 WCF REST 之上的一层。
请参阅 ADO.NET DataServices 团队的 blog post 了解此问题。
马克
【讨论】:
【参考方案2】:这是 Roy Fielding 的一句话,他是 REST 一词的发明者
如果你发现自己需要一个 分布式事务协议,然后 你怎么可能说你的 架构是基于 REST 的吗?一世 根本看不到你怎么能从中得到 一种情况(使用 RESTful 客户端上的应用程序状态和 确定所有状态的超媒体 过渡)到下一个情况 需要分布式协议 事务语义,其中 客户端必须告诉服务器如何 管理自己的资源。
...现在我考虑“休息交易” 是矛盾的。
来自 2009 年 6 月 9 日 REST 讨论列表中的 message。
【讨论】:
好的,所以菲尔丁应该解释(显然,这本身就是一项任务)我应该如何告诉服务器:创建这两个资源,但同时,而不是首先创建这个资源,然后是其他资源。 POST /MyResourcePairs 我会给你一个更真实的例子,但你会发现在大多数需要发生事务的情况下,用户使用一个名词来指代该事件。因此,从最终用户的角度来看,您所描述的内容很少存在。 换句话说,它会违反无状态约束。【参考方案3】:这是最近关于这个话题的讨论:http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/e66651c0-9202-4049-a8f4-55971b8b359d
基本上它说:单个请求不支持事务并且支持它们没有意义,因为单个 POST/PUT/DELETE 请求中只涉及一个实体和 CUD 操作。但是事务可以通过以下方式在服务器端实现:
使用批量请求(一整套 POST/PUT/DELETE 请求从客户端一次性发送到服务器) 并利用处理管道(在 Processing 事件中开始事务并在 Processed 事件中提交/回滚事务)【讨论】:
【参考方案4】:我主要同意 Darrel 的回答中引用的 Roy Fielding。您永远不应该通过 RESTful Web 服务公开应用程序管道,例如数据库事务。但是,您可以以更实用的方式处理分布式事务。
假设您正在实施一个销售点系统,该系统可以收集购物礼券。客户应该能够将礼券与信用卡付款相结合。礼券和信用卡付款均由销售点外部的系统处理。收集礼券并进行信用卡付款应该是一项原子交易。为方便起见,让我们关注一个案例:客户将首先领取礼券,然后用信用卡支付剩余的金额。信用卡付款可能会失败,因此您还希望在发生这种情况时回滚礼券收集。
礼券服务公开了一个用于发起收藏的 URL:
/gift-voucher/gift-voucher-id/collection
请求此 URL 将创建并保留礼券的预订。响应包含预订的 URL:
/gift-voucher/gift-voucher-id/collection/reservation/$reservation-id
可以发布或删除此 URL,以分别执行或取消礼券收集。
请注意,这种方法仅适用于存在回滚交易的功能用例(即信用卡支付失败)的应用程序服务。尝试将其应用于实体服务等较低级别的服务可能会涉及大量工作并且性能非常糟糕。在这种情况下,您可能想知道 RESTful 服务是否真的是最佳选择。
【讨论】:
以上是关于REST WCF 服务中的事务的主要内容,如果未能解决你的问题,请参考以下文章