2011-03-07 58 views
2

有一個WCF服務被調用來更新數據庫中的記錄。如果連接中斷,服務將繼續處理數據,但客戶端將不知道結果。 I.E.處理可能成功或失敗;客戶端不知道它是否應該重新發送數據。WCF Services:丟棄的連接處理

典型的例子是銀行存款。 ATM收取押金並進行WCF呼叫以更新客戶的賬戶。連接被中斷,ATM不確定是否處理了存款。如果不是這樣,並且自動櫃員機不重新發送,那麼客戶在他的賬戶中沒有錢。如果ATM重新發送,但存款已處理完畢,他將有兩筆存款。

在WCF服務調用上啓用事務似乎是要做的事情,但他們可以處理丟棄的連接嗎? I.E.如果客戶端失去與服務器的連接,客戶端可以回滾事務,但如果客戶端未連接,服務器如何知道回滾?

+0

er ...是「TIA,James」不適合添加到問題嗎?你爲什麼刪除它? –

回答

1

看來,無論你如何看待它,嚴重的災難性失敗都有可能發生。

假設您正在使用異步客戶端調用和/或在服務端執行的處理量相對較大。如果在時間跨度的範圍內,客戶端與服務的連接被中斷,那麼客戶端就無法知道服務最後留下的狀態。如果是中間事務,服務端事務將被自動取得...如果是交易後,那麼你的工作就完成了......但在這兩種情況下,客戶都將「永遠不知道」。如果一臺ATM在存款過程中失去了連接,理論上......(並且不要在此引用我,但它聽起來像一個合乎邏輯的場景)......我相信(並且像我說過的那樣,請在此引用我)ATM本身保存內存中的事務列表,以便在事務失敗的情況下,一旦連接重新建立,它可以自行檢查並驗證事務是否實際完成。 (如果它實際上不這樣做......我會有點擔心)。

長話短說......我相信在這種情況下唯一可以做的事情是讓客戶端保持某種與服務端匹配的校驗和,這樣如果發生連接失敗,當連接重新建立時,它將能夠檢查服務以查看事務是否確實完成。

+0

檢查一次連接是否恢復正常,但是要檢查什麼?最近有一筆100美元的存款?不是很可靠......一位同事的建議是從WCF服務申請一個交易ID並將其傳遞給實際的存款電話......雖然這似乎變得相當迅速複雜。 –

+0

你可以請求任何你想要的東西......只要你願意構建它......你可以散列交易本身的數據並檢查哈希客戶端。你的權利。它確實有可能非常迅速地變得非常複雜。 – Patrick

0

我會使用BizTalk等EAI提供程序編排WCF服務,併爲服務公開的每個操作設置補償操作,以便在發生故障時執行回滾。

+0

我會研究更多...現在,這是一個很大的學習曲線,還有很多軟件/硬件/設置...不認爲我可以在短期內做到這一點:( –