2010-05-05 71 views
1

我使用netTcpBinding創建了一個自託管的WCF服務。我正在使用基於WinForm的客戶端連接到此服務。我發現當客戶端啓動並運行時,我總是失去與WCF服務的連接 - 出現故障狀態!當客戶端嘗試連接時,WCF服務主機返回「TCP錯誤10061 - 連接被拒絕」

要解決這個問題,我創建了一個線程來保持連接活着。我讓客戶坐下來,大約一週後,在我的日誌中發現一條錯誤消息:TCP連接錯誤10061 - 客戶端被拒絕連接。保持活動線程無法重新創建連接對象 - 日誌仍然顯示「連接被拒絕」。

在我的配置文件的服務主機,我有一個基地址,但沒有端點地址。 MSDN說,當沒有給出端點地址時,當調用Open方法時,端點地址變爲基地址。

我是否還需要給一個端點地址來解決「TCP連接被拒絕」的問題?

在此先感謝您的任何建議。

回答

2

我認爲主要的問題是,你總是試圖保持一個連接「活着」到WCF服務。這不是用WCF服務來完成的。

在WCF中,推薦的最佳做法是使用「每次通話」激活,例如,客戶端調用該服務,爲該請求創建一個新的服務類實例並對其進行處理,然後對其進行處理,客戶端和服務器之間的連接基本上再次完成。

現在NetTcpBinding的特殊之處在於它具有與服務器的傳輸級會話。但是,你還是應該

  • 創建客戶端代理
  • 呼叫服務
  • 關閉客戶端代理

作爲一般規則。此外,如果您的頻道處於故障狀態,這意味着您在服務器端發生了.NET異常,這些異常不會被捕獲和處理。在這種情況下,WCF進入「恐慌模式」,基本上使通道無效 - 客戶端與服務器之間的連接。畢竟,你的服務器端代碼剛剛爆炸 - 保持頻道活躍的關鍵點是什麼?因此,在服務器端,您需要確保捕獲並處理所有.NET異常,並且如果要將它們發回給客戶端,請將它們轉換爲SOAP Faults(FaultExceptionFaultException<T>),以便它們不會擊敗頻道。查看WCF的IErrorHandler界面。

而在您的客戶端,您需要構建一些邏輯來檢查故障通道狀態,如果它確實發生故障,請將其丟棄並從頭開始重新創建。

把所有這些東西放在適當的位置上,對於WCF服務應該沒有任何問題 - 沒有像後臺線程那樣的黑客需要「保持活動」連接。

+0

非常感謝。 – Subbu 2010-05-06 15:58:05

+0

我的應用程序的設計是這樣的,服務主機需要將異步消息發送回客戶端。如果我要關閉客戶端代理,如何從WCF服務獲取異步回調?服務是否有另一種方式可以回撥給客戶? – Subbu 2010-05-06 17:13:54

+0

@Subbu:好吧,你沒有在你的問題中提及這一點。如果您需要雙工通信,那麼您需要更加小心,不要讓.NET異常導致您的頻道出現問題。 – 2010-05-06 18:03:52

相關問題