【发布时间】:2012-02-15 14:48:14
【问题描述】:
我正在通过 basicHttpBinding 公开 WCF 服务,该服务在数据库上执行多个操作。
我想保证如果客户端没有收到回复,数据库操作将回滚(没有任何事务流通过 WCF)。 例如。客户端调用在服务器上执行的“DoX”方法,但在完成之前客户端崩溃。一旦无法向客户端发送回复,则应立即回滚数据库操作。
有没有办法做到这一点? [OperationBehavior(TransactionScopeRequired=true)] 属性会以这种方式工作吗?是否有可能在服务器端处理通信错误?
更新 1:
似乎[OperationBehavior(TransactionScopeRequired=true)] 在向客户端发送回复之前提交了事务,因此如果客户端没有收到回复,则不能用于执行回滚。
更新 2: 再次明确说明,我不需要事务以任何方式与客户端交互。客户端既不应该知道事务,也不能取消或提交它,也不应该有任何事务流过绑定。如果传输通道无法将消息传递给接收客户端,我希望事务回滚的唯一位置是在服务器端。在 TCP/IP 的情况下,该信息应该很容易提供给服务器。 (没有返回给客户端的 TCP 数据包的 ACK)
所以一个假设的服务器端执行流程(注意缺少客户端)应该是:
Receive client request
Start transaction
Execute all logic inside the service operation
Send reply back to client
if (reply.failedToReceive) { transaction.Rollback() } // due to a failing TCP/IP transmission
【问题讨论】:
-
要在 WCF 中进行事务,您需要 WS-Transaction。这不适用于 basicHttpBinding 端点。它需要 wsHttpBinding。更多详情请见this question
-
为什么需要使用basiHttpBinding? wsHttpBinding 会给你这个。
-
我没有尝试将事务 通过 WCF 传递给客户端,事务应该专门在服务器端,因此不使用像 WS-Transactions 这样的机制。跨度>
-
@JustinDearing:访问服务的客户端不支持wsHttpBinding。
-
使用
basicHttpBinding,无法知道客户端是否收到响应。
标签: wcf transactions basichttpbinding