2013-10-17 60 views
1

考慮以下情況:WCF客戶端,是否保存引用?

有一個Windows服務託管WCF服務。

WCF服務提供客戶端與位於物理上不同機器上的AppFabric服務器之間的接口。它retreievs對象,計算它並返回最好的一個。

20-30客戶端可以同時連接到該服務,這是不是很多。

什麼會更好,每次在服務上完成查詢時創建實例,或者讓客戶端對象作爲成員並調用函數。創建一個實例拋棄所有與嘗試finally塊,我不喜歡,但客戶端連接怎麼樣,有什麼缺點?主機是否可以重新啓動並讓客戶端仍然可以工作?什麼是通常/首選的方式來做到這一點?

try 
{ 
    PreOrderService.PreorderServiceClient proxy = new PreOrderService.PreorderServiceClient("netTcpPreorderService"); 

    List<PreOrder> preOrders = proxy.FindWallet(preOrder.WalletId); 
} 
finally 
{ 
    if (proxy.State != CommunicationState.Faulted) 
    proxy.Close(); 
} 
+1

[WCF代理生命週期的最佳實踐 - 或者關閉WCF代理的頻率如何?]可能的重複(http://stackoverflow.com/questions/4047524/best-practice-for-wcf-proxy-lifetime-or – CodeCaster

+1

我有一個答案,我刪除了,因爲進一步閱讀(即CodeCaster可能重複的問題,以及CodeCaster在我的答案的評論中提出的一些觀點)告訴我,我自己的答案是無能的。我希望得到的一個重要部分 - 即使您確實讓代理成爲對象成員(很確定您仍然可以),但您仍然需要在每次通過代理進行調用時嘗試/ catch/finally。 –

回答

0

我喜歡做如下:

proxy = newServiceReference1.ServiceDataContractTestClient(); 
try 
{ 
    proxy.MetodThrowsException(); 
    proxy.Close(); 
} 
catch 
{ 
    proxy.Abort(); 
    throw; // Or handle exception 
} 

這並不關心,如果服務器連接已丟失,當proxy.MetodThrowsException()打破了服務器不會引發CommunicationObjectFaultedException。

如果您發現它降低了可讀性,那麼將其包裝在一個單獨的方法中。

相關問題