我有一个 WsHttpBinding
请求-回复服务方法,该方法针对中间层服务(连接到数据库)处理事务,并使用事务 ID 向客户端返回响应消息。
我有几个问题:
如何在客户端收到响应之前检测到意外断开连接/故障?我注意到 channel_faulted 事件永远不会为
WsHttpBinding
触发。假设#1 可以实现,我如何才能获得原始交易 ID(在传出响应中),以便回滚/撤销客户端未收到的交易?
非常感谢任何帮助。谢谢。
最佳答案
首先,一般来说,该服务应该对其客户知之甚少或一无所知。系统的设计方式不应像这样紧密耦合。
这对您的场景意味着您可能需要使用可靠的消息传递 - 类似于 NetTCPBinding
或 WSHttpBinding
。如果客户端没有收到消息,您的服务器就会知道。
我建议你看看chapter 7 in Juval Lowy's Programming WCF Services .第 7 章是关于 WCF 中的事务的。
WCF 中的事务支持允许您的客户将他们的事务传播到 WCF 服务。
如果您正在使用 WCF 事务并且对客户端的回调由于任何原因而失败,事务将中止(回答您的第二个问题)。通过这种方式,您的服务不需要了解您的客户的任何信息。 WCF 会为您处理。
Lowy 建议结合使用可靠的消息传递和 transactionFlow。像这样的东西:
<netTcpBinding>
<binding name="TransactionalTCP" transactionFlow="true">
<reliableSession enabled="true"/>
</binding>
</netTcpBinding>
关于WCF:如何在 WsHttpBinding 中检测断开连接并获取原始上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6144924/