2009-11-05 130 views
5

我正在使用VS 2008服務引用來使用WCF服務並創建其代理。WCF客戶端代理初始化

我找調用WCF服務方法

  • 我應該我每次調用服務方法,一旦我做完這些後關閉客戶端時創建客戶端代理實例的最佳模式?當我分析我的客戶端應用程序時,我可以看到在初始化代理客戶端時獲取頻道需要很長時間
  • 我應該爲客戶端代理使用Singleton模式,以便我可以只使用一次實例並獲取擺脫重新初始化開銷?這種方法有沒有隱藏的問題?

我正在使用.Net框架3.5 SP1,basicHttp綁定幾乎沒有自定義。

+0

@ 123開發者:太好了 - 謝謝! (這對新人來說並不容易「明顯」 - 我同意 - 這就是我指出的原因) – 2009-11-05 17:06:43

回答

10

這取決於;-)

如果你在你的應用程序的順序,需要一前一後幾個電話,你可以掛在代理客戶,並繼續使用它進行進一步的調用。儘管要檢查「故障」狀態,但要警告 - 如果服務器上發生錯誤,客戶端代理和服務器之間的通道可能「出錯」,從而導致客戶端代理變得不可用。

而且 - 昂貴的部分是ChannelFactory<T>的創建 - 你可以嘗試這兩個步驟分離出來,當你在代碼中創建您的客戶端proyx:到該通道工廠,例如

ChannelFactory<IYourService> factory = new ChannelFactory<IYourService>(); 

航緩存某處

第二步應該是在時間上和馬力更密集:

IYourService client = factory.CreateChannel(); 

你可以做的每調用之前這一步(或稱序列),不應該出來變得糟糕表現那真的。

我強烈建議儘可能避免單身 - 這就像打開一罐蠕蟲,除非你絕對肯定必須(例如,管理對一個呼叫者只有一個呼叫者一次)。

馬克

+1

我同意製作單個工廠實例的方法,並且沒有單例通道實例。對於通道,請使用em和鬆動em,並確保正確關閉它們,檢查故障狀態。 – CodingWithSpike 2009-11-05 17:05:03

0

對不起,我踢了一個老問題,但我想添加此,以供參考。

我完全同意marc_s和rally25rs。所以從這裏開始,還要考慮使用處理故障狀態的代理或包裝器。 Here is a question在SO上討論了一些解決方案,here is another我在Corneliu的互聯網上遇到的很好的解決方案,「構建可重複使用的ClientBase代理」。他的解決方案生成的包裝可以暴露您的服務方法,以獲得最大的便利性和性能我仍然需要測試它是否可以正常工作:)。