2011-05-26 51 views
3

我有一個WsHttpBinding request-reply服務方法,該方法處理針對中間層服務(連接到數據庫)的事務,並向客戶端返回響應消息一個交易ID。WCF:如何檢測斷開連接並獲取WsHttpBinding中的原始上下文

我有幾個問題:

  1. 我怎樣才能在客戶端意外斷開/故障它接收到響應之前檢測?我注意到channel_faulted事件從未觸發WsHttpBinding

  2. 假設可以實現#1,我如何獲得原始事務ID(即在傳出響應中),以便回滾/反轉客戶端未收到的事務?

任何幫助,非常感謝。謝謝。

回答

0

首先,一般來說,服務對其客戶應該知之甚少。系統的設計應該不會像這樣緊密耦合。

這意味着您的情況可能是您需要使用可靠的消息傳遞 - 如NetTCPBindingWSHttpBinding。如果客戶端沒有收到消息,您的服務器將知道。我建議你看看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> 
+0

感謝您的回覆。也許我只是不理解某些東西,但我不確定緊密耦合在哪裏發生。基本上,我只想讓服務檢測客戶何時未收到響應,以便恢復對系統的任何更改。不幸的是,客戶將無法參與任何分佈式事務。如果發生故障,我們唯一能做的就是保持我們的系統處於一致的狀態。 – shyneman 2011-05-26 23:09:23

+0

我已經嘗試啓用可靠消息傳遞,但通過我自己的測試,服務仍然無法檢測客戶端何時斷開連接時發送迴應。您知道服務器何時可以知道客戶端斷開連接的機制(例如事件)嗎? – shyneman 2011-05-26 23:09:34

+0

緊密的耦合是服務知道有關客戶端的任何信息。它不應該對客戶端有任何瞭解 - 僅從客戶端收到的有效載荷。 – 2011-05-27 00:17:45