2016-11-16 89 views
0

我們目前正在開發一個軟件解決方案,其中包含一個客戶端和一些WCF服務。我們遇到的問題是WCF服務在閒置一段時間後超時。據我瞭解,有2種方法來解決此問題:WCF超時處理

  1. 增加超時(據我瞭解,這是一般不建議如設置超時爲無窮/周被認爲是不好的做法。)
  2. 定期從客戶端ping WCF服務(我不確定我是否是他的粉絲,因爲它會添加多餘的定期呼叫)
  3. 處理超時問題並嘗試重新連接(這很慢並且需要一個很多手動代碼)
  4. 可靠的會話 - 一些消息來源提到這是內置的WCF ping和消息可靠性機制,但其他來源提到這仍然會超時。

解決此問題的建議/最佳方法是什麼?有沒有關於這方面的官方閱讀材料?我自己找不到那麼多信息

謝謝!

回答

1

正如我所看到的,你必須結合你所說的要點。

  1. 你是對的,增加超時是不好的做法,可以給你很多問題。
  2. 如果您不想使用可靠會話,那麼Ping是保持連接的唯一適用方式。
  3. 您需要處理這些事情,無論發生超時,連接丟失或引發異常。有很多可能性,您的連接可能會發生故障。
  4. 可靠的會話是不實施ping的好方法,但從技術上講,它幾乎是一樣的。 WCF自動發送「我還在這裏」請求。

這個結論是,你需要點3和點2或4.爲了減少手動代碼點3,你可以使用代理或一個包裝你的ServiceClient,建立一個新的連接,如果在請求期間,老人有故障。第4點很容易實現,因爲在你的配置中你只需要添加一些小的附件。而流量開銷並不大。第2點是最昂貴的方式,您需要處理只能ping服務器和服務需要擴展的線程/任務。但正如你之前所說的,可靠會議可能會失敗,而Pings應該把你帶到安全的一邊。

+0

這聽起來似乎是對的,我猜測。感謝您分享你的觀點:)你有很多WCF的經驗嗎?你最終實現了類似的模式嗎? – Ross

+1

@Ross是的,我們在wcf中編寫了一個動態雙工服務,作爲幾個室內項目的基礎。我的回答反映了我過去3年在wcf的所有經歷。我們實現了第3點和第4點,但可靠會話並不像他們應該那樣可靠;)因此,我們實現了Ping,因此,所有的運行都是完美的。 – Rabban

+0

很高興聽到!非常感謝分享你的經驗:) – Ross

1

你應該問自己你的WCF端點在做什麼?您的命令設置方式是最優化的嗎? 也許最好是讓您的端點花費很長時間才能基於輪詢系統,這樣可以快速查詢而不是等待端點操作的結果。 您還應該將數據傳輸視爲一個可能的問題。您傳輸的數據量是多少?

爲了得到更明確的答案,我們需要了解更多關於特定端點以及服務的其他責任。

+0

我們有幾個不同的WCF服務用於不同的目的。有些是單工,有些是雙工。他們都執行快速操作(最多幾秒鐘,大多數速度更快)。問題在於其中有一些是間歇性使用的,所以對這些服務的請求之間可能會有數小時的時間,我們希望讓這些服務保持運行,而不必每次都使用它們,這意味着延遲。 – Ross

+0

您應該沒有問題讓兩個進程運行。嘗試在一段時間後調用某個呼叫時,是否嘗試過在兩個進程之間重新建立連接? –

+0

意外擊中'輸入'。 如果您爲每個服務命令重新建立連接,則可能會使連接問題更容易。 你是程序應該有循環,他們正在運行,以便能夠根據請求回答端點命令。不應該每次都需要啓動進程。 他們爲什麼會倒下?如果這是由於超時造成的,那麼這是服務之間的命令耗時過長的問題。 –