2009-07-30 197 views
5

我有一個使用WCF服務(WSHttpBinding)的mvc控制器類,有時會在一個http請求中多次調用,並且想知道爲該服務創建客戶端的成本。可以爲每個調用創建客戶端實例,還是應該在類中創建成員變量?WCF客戶端實例化

public class RingbacksController : Controller 
{ 
    private void LoadContactsIntoViewData(int page) 
    { 
       RingbackServiceClient client = new RingbackServiceClient(); 
     ... 
     client.Close(); 
    } 

    private void LoadGroupsIntoViewData(int page) 
    { 
       RingbackServiceClient client = new RingbackServiceClient(); 
     ... 
     client.Close(); 
    } 
} 

public class RingbacksController : Controller 
{ 
    private RingbackServiceClient client = new RingbackServiceClient(); 

    private void LoadContactsIntoViewData(int page) 
     { 
     ... 
     client.Close(); 
    } 

    private void LoadGroupsIntoViewData(int page) 
    { 
     ... 
     client.Close(); 
    } 
} 

回答

1

如果你決定去一個成員,請記住,一旦它出現故障,所有的呼叫後會失敗。至於是否值得,我建議基準。

3

創建客戶端通常不是一個非常昂貴的操作 - 所以當你需要時,你應該很好地實例化它(就像Steven也提到的那樣 - 如果由於錯誤而出現故障,你仍然需要這樣做) 。

如果您使用ChannelFactory創建頻道(這是實現頻道的一種方法),另一方面創建ChannelFactory是相當重量級和時間密集型的操作,所以這將是一個好主意儘可能長時間掛在ChannelFactory實例上。

馬克

+0

這仍然適用於.NET 4.5:http://msdn.microsoft.com/en-us/library/hh314046(v=vs.110).aspx – 2013-12-02 11:46:13

2

在過去,我已經創建了的ChannelFactory <的新實例>和客戶端/代理每次調用WCF服務。我沒有遇到任何問題,特別是對於演出。我編寫的應用程序部署在內部公司網絡(本地LAN)上,其中大約30個Windows Forms客戶端將連接到我的WCF服務。

看看下面的問題Where to trap failed connection on WCF calling class?和我的答案。它基本上是一個處理客戶端/代理實例化的包裝類,並且執行了很多必要的錯誤處理以克服WCF設計中的某些缺陷(鏈接問題中有更多信息)。

您可以重寫它或在另一個工廠進一步包裝它,這樣如果您擔心性能,可以緩存ChannelFactory和客戶端/代理。我「聽說」緩存ChannelFactory或客戶端/代理是一個糟糕的主意 - 但是,我願意在這裏進行更正。