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