2008-11-09 21 views
4

我們目前正在研究一個將使用WCF服務的應用程序。主持人(客戶)正在使用優秀的WCF Service Proxy Helper from Erwyn van der MeerWCF是否優化客戶端的連接?

我想知道的是,如果我多次打開此對象...它會導致多個(昂貴的)連接,或將WCF管理它並彙集連接。

我之所以想知道這是因爲我們將在同一個Web請求中的不同時間點調用服務的方法,我們目前已經在調用中包裝了Service代理類的實例。

例如:

MyService.MyMethod1() // wraps the connection usage as well as the call to the service 

,我怎麼會去儘量減少連接的數量,同時保持代碼的任何建議與SRP符合將是極好的。

那麼,任何想法?

+0

明天會測試3個答案,並會給出我的意見,哪一個最好。 :) – 2008-11-09 23:30:36

回答

4

您應該儘量減少您創建的代理對象的數量。 WCF中的代理設置起來相當昂貴,因此多次創建和調用函數比爲每個方法調用創建一個新代碼更有效。

代理對象和連接之間的關係取決於使用的傳輸。對於http傳輸,每個函數調用都會啓動一個HTTP連接。對於net.tcp傳輸,連接建立在Open()時間並保持到Close()。某些綁定設置(例如支持WS-SecureConversation的綁定設置)將引發額外的「內務」連接和消息交換。

AKAIK,沒有開箱即用的綁定執行連接池。

+0

所以如果我有單個代理對象,我可以同時在不同的線程中調用它的方法(如果我的邏輯是線程安全的)。那麼有什麼更好的;從單個對象調用還是每個線程都有對象? – 2009-05-13 06:39:01

3

您可能會檢查this article以獲取有關使用代理的最佳做法的信息。

3

它不會像SqlConnection那樣進行池化,如果這就是你的意思。

[告誡:我使用「連接」在這裏鬆散的意思的邏輯連接,不一定是物理連接]

使用按需連接,並保持一個周圍,有優點和缺點在兩者之間方法。在初始化連接時有一些開銷,所以如果你正在做5件事情,你應該嘗試在同一個代理上做 - 但是我不會爲了它而保留一個長期代理。

特別是,在生命週期管理方面,一旦代理髮生故障,它會一直處於故障狀態 - 所以您需要能夠從偶然的故障中恢復(這應該是可以預料的)。同樣,在某些配置中(會話/實例的某些組合),連接在服務器上佔有一定的空間 - 爲了提高可伸縮性,應該保持連接的短暫性。當然,對於真正的可擴展性,你通常希望禁用這些選項!

創建連接的成本還取決於安全模式等。 IIRC,使用消息安全性打開雙向驗證連接比創建TransportWithMessageCredential連接要更昂貴 - 因此,「YMMV」就是這種情況。

就我個人而言,我發現代理性能最大的共同問題與建立一致性的時間無關 - 這是API的煩人之處。即

情形A:

  • 打開一個連接
  • 執行1個操作具有大的有效載荷(即,消息的意思是 「做這些19個東西」)
  • 關閉代理

情景B:

  • open a co nnecton
  • 執行19個操作與小型有效載荷
  • 關閉連接

然後一個場景通常是顯著更快由於延遲等和國際海事組織也別想在WCF分佈式事務; -p