2011-06-15 183 views
3

這可能是在黑暗中拍攝的(我對WCF的內部知識並不瞭解),但是這裏還是...從服務器端結束WCF會話?

我目前正在一個客戶端網站上使用遺留應用程序,重新遇到WCF服務的持久性問題。該應用程序使用Microsoft Sync Framework 2.0並通過上述服務進行同步。服務器端的服務實現有很多在各種狀態下的自定義代碼「一塌糊塗」。

不管怎樣,我們看到客戶端應用程序的大部分時間,我們正在縮小使用同一臺機器上打同樣的服務上的應用程序上不同的用戶中心模式的錯誤。它似乎,服務和客戶端上的身份驗證級別不同步的某種方式。

在文章here中討論了該錯誤,我們正在研究從消息層安全性切換到傳輸層安全性的方法,這將有望解決問題。但是,如果這個問題有意義,我們或許可以用侵略性較小的方式來解決它。

在鏈接的文章,其中一條建議是要強行終止連接,如果特定的異常被捕獲,再試一次,如果再次失敗,這是因爲這個特殊的理論沒有。聽起來不錯,並且易於實施。但是,我發現自己無法確信連接是否正常終止。

服務操作通過自定義接口,該接口是在服務器側實現。該接口可以做些什麼來結束連接的唯一的事情就是對代理本身,它是一個自定義的方法在服務器上調用EndSession()通話EndSession()

所以......

從WCF服務方法,有沒有辦法正常和正常終止的方式,客戶端會喜歡與客戶端的連接?

也就是說,在這個自定義EndSession()有一些最後一步,我可以採取導致服務器完全忘了這方面是開放的?因爲它似乎當在同一臺機器上的另一個用戶試圖在應用程序內打服務一樣,當它失敗的鏈接文章中的錯誤的。

這個想法是,在事物的客戶端,調用EndSession()的代碼後面是將代理對象清零,然後調用工廠方法以在下次需要時提供另一個工廠方法。所以我想如果更多的東西需要在服務器端發生的(並且默認在WCF確實,如果不是這一切的自定義實現代碼)終止對端的連接?

就像我說的,在黑暗中拍攝。但是,也許在回答/討論,在這裏我至少可以進一步診斷問題,所以任何的幫助深表感謝。謝謝。

回答

3

不幸的是只有真正的三種方式,其中session可以終止

  1. 客戶端關閉代理
  2. 服務的receiveTimeout在客戶端之前超過 發送另一個 要求
  3. 的服務引發一個 非故障例外,它將故障 通道,因此終止 會話

如果您不希望涉及的客戶端,那麼您只有2個和3個客戶端都沒有問題 - 他們在下次嘗試與服務對話時都會遇到異常情況。

你可以使用Duplex messaging並獲得服務,通知其需要終止會話的客戶端 - 客戶端,然後得到一個機會,以更加方便地關閉代理,但是這是一個合作戰略

+0

對不起花了一段時間才能得到回到這裏,這個項目一直是忙碌的一週。我想我們會稍微考慮一下雙工信息(雖然這種遺留代碼的狀態不適合改變),但我很欣賞這個建議。但是我至少在終端上測試了你的觀點,但對於客戶來說並沒有很好的結局,而且你完全正確:)無論如何,由於團隊不完全瞭解的原因,系統現在大都在工作。我認爲我們讓客戶成功關閉了代理。感謝您的建議! – David 2011-06-18 12:07:23