2010-08-13 126 views
0

也許我在這裏錯過了一些基本的東西,所以請糾正我,如果我。我有一個本地服務,並通過WCF進行通信的WinForms應用程序,但我似乎在我的應用程序有很多這樣的代碼拷貝到結束:管理經常呼叫的WCF連接

Public Shared Sub MyLocalMethod1() 
    Dim tcpBinding As New NetTcpBinding 
    tcpBinding.SendTimeout = New TimeSpan(0, 0, 5) 

    Dim tcpFactory As ChannelFactory(Of MyWCFClass.MyWCFInterface) = New _ 
         ChannelFactory(Of MyWCFClass.MyWCFInterface)(tcpBinding, "net.tcp://localhost:4079") 

    Dim ServiceWCFConnection As MyWCFClass.MyWCFInterface = tcpFactory.CreateChannel 

    ServiceWCFConnection.MyWCFMethod1() 

    tcpFactory.Close() 

End Sub 

我也許應該在某種類型的可以這樣做創建連接的助手類,讓我的服務使用它,然後關閉連接,所以我沒有這個連接代碼的多個副本。但是,我應該讓這個連接斷開嗎,還是每次關閉它都有意義? WinForm通常每隔幾秒鐘就會調用一次服務,所以嘗試使用這些不同的調用都可以訪問的公共副本更有意義,而不是每次都打開一個新的關閉連接。

回答

1

這取決於您的需求,因爲兩種方法都是正確的。你可以將你的頻道創作代碼包裝到一些幫手中。您將具有與此時使用單一位置相同的功能來編輯頻道創建代碼(DRY原則)。該服務的使用速度較慢,因爲每次調用都會創建新的TCP連接。使用一些一次性輔助類來表示您創建的連接。

如果您決定對整個應用程序使用單通道(代理),則必須考慮一些新的複雜性。您正在使用創建傳輸會話的Net.Tcp綁定 - TCP連接將長期存在。此外,WCF服務實例將與連接同時存在,因爲默認實例化模式是PerSession。所以單個服務實例將處理來自客戶端的所有請求=您的服務將變爲有狀態。另外,當您使用打開的通道進行多個呼叫時,您必須測試通道的狀態 - 網絡問題,服務器問題,超時或未處理的異常將把通道切換到故障狀態 - 此通道和相關服務實例不能再使用。你必須放棄這樣的頻道並打開新頻道。