WCF basicHttpBinding:回复客户端失败时回滚

时间:2012-02-15 14:48:15

标签: wcf transactions basichttpbinding

我通过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

1 个答案:

答案 0 :(得分:1)

这个问题没有简单的答案。您要求的是在WS- *中实现但使用基本SOAP完成的行为。我认为,如果你真的无法切换到wsHttpBinding或使用@Trevor Pilley建议的双工,那么你唯一的选择就是尝试在基于SOAP的自定义协议中模仿WS-Transaction的行为。

您应该能够对完整的WS-Transaction规范进行一些简化,因为

  • 您可能只需要通过单个服务支持交易 - 您不会通过多个独立服务进行分布式交易
  • 您不需要同时支持简短的交易(WS-AtomicTransaction)以及长期运行的交易(WS-BusinessActivity)可能原子交易会做什么
  • 您不需要支持任何类型的可扩展性模型(WS-Coordination
  • 您不需要实现描述协议的发现/元数据模型(例如WSDL),因为您将协议行为直接编码到客户端和服务中。

但是,您可能需要WS-Coordination和WS-AtomicTransaction的元素。无论如何这都不是一项简单的任务,很容易错过一些微妙的东西,这些东西可能会导致回滚不会发生,或者(同样糟糕)通过在数据库中长时间锁定来破坏服务的性能客户崩溃了。

就像我说的,这是一种复杂的行为,如果你不能使用现成的标准化协议,那么就没有简单的答案。