2011-02-25 28 views
0

希望WCF通過Throttling在服務端具有伸展實例化和併發管理。WCF客戶端實例化和併發問題

我的服務客戶端是ASP.NET應用程序。它消耗多個WCF服務,所以我在運行時創建並參數化了WCF客戶端(不使用配置文件)。

只有終點地址是動態的,並且所有服務(由客戶端使用)具有相同的方法簽名(相同的合同)。

爲此,我已經通過Visual Studio引用的服務,並創造了我的服務代理,所以我只照顧端點地址在運行時:

class MyWcfClient 
{ 
    void DoSomething(string endpintAddress, int data) 
    { 
     // Create 'binding' and 'endpoint' ('endpoint' address is dynamic) 
     ServiceReference.ServiceClient serviceClient = new ServiceReference.ServiceClient(binding, endpoint); 
     // Parametrize 'serviceClient' 
     // Call WCF method (send 'data' to appropriate endpoint) 
     serviceClient.CLose(); 
    } 
} 

由於客戶端是一個asp.net應用,每個請求都運行在它自己的工作線程上(WCF方法調用非常輕巧,所以線程很長時間不會阻塞)。

我的問題是關於客戶端的實例和併發性。

應該MyWcfClient類是Singleton一個serviceClient實例或它是static類和新serviceClient爲每個調用創建?

我應該創建基於端點(有10-100個端點)的serviceClient(即數組或列表)嗎?

請注意,我的asp.net線程不應該被阻止了很長一段時間(即在隊列中等待發送它們的相關data通過WCF

回答

0

有對客戶端沒有限制,它沒有必要的,因爲您可以控制客戶端代碼,因此您可以控制執行的請求數量。這與服務的區別在於,如果不進行限制,則無法控制其他地方執行的未完成請求的數量(停止服務控制)。

所以,如果你想控制在客戶端上併發執行的請求的數量,你必須創建對象池 - 將只有有限數量的MyWcfClient類可用,每個類將始終創建新的ServiceClient。請求將在隊列中等待免費的MyWcfClient實例。

如果你唯一的問題是如何創建ServiceClient的實例,那麼答案取決於綁定的類型。

  • Sessionful綁定喜歡的net.tcp,Net.Pipe或WsHttp具有可靠的會話或安全上下文:對於每個通信關係創建新實例。如果您的關係只是單一呼叫,請爲每個呼叫創建一個新的會話。所以你可以在靜態方法中使用靜態類,並在該方法中創建新的實例。
  • Sessionless綁定,如BasicHttp或WebHttp:您可以重複使用客戶端進行多個調用,但不能在後續調用之間關閉客戶端。您可以使用準備好的客戶端實例的數組。你仍然需要在這裏處理一些錯誤。

Btw。還請檢查asynchronous client calls以及如何correctly close服務客戶端。

+0

'WCF'支持某種緩存('MRU'緩存),在提問時我並不知道。不過,我不確定如何將其與我的方案一起使用,因爲有幾篇關於它的文章。 – Xaqron 2011-02-26 12:19:07

+0

@Xaqron:如果您在代碼中提供綁定,則無法使用MRU緩存。僅當您提供端點配置的名稱時,MRU緩存纔有效。 MRU依賴於端點配置,遠程地址(您可以將另一個地址傳遞給代理構造函數)和回調接口(僅用於雙工服務)。 – 2011-02-26 15:19:58

+0

你是對的,在閱讀了一些文章後,我決定將綁定移動到配置文件並使用MRU緩存。我不需要會話,但仍需要「消息」安全性。 – Xaqron 2011-02-26 15:39:35