2013-09-23 60 views
5

訪問一個釋放的對象例外,我使用下面的代碼來調用WCF服務方法不能在WCF

MyServiceClient proxy = new MyServiceClient(); 
proxy.Open(); 
proxy.Func1(); 
proxy.Close(); 
// Some other code 
proxy.Open(); 
proxy.Func2(); 

proxy.Close(); 

我得到的異常而調用「proxy.Open()」第二次,但有時代碼工作。我也可以使用下面顯示的代碼,它工作正常。

MyServiceClient proxy = new MyServiceClient(); 

proxy.Func1(); 

// Some other code 

proxy.Func2(); 

proxy.Close(); 

我也想知道哪個是更好的調用函數的方法。哪種方法可以提供更好的性能?

+0

也許你只是刪除它來簡化,但你應該使用'finally'來確保你總是關閉開放資源。 –

回答

7

一旦關閉連接,就不能重新使用它。

您需要在此處新建一個MyServiceClient

MyServiceClient proxy = new MyServiceClient(); 
proxy.Open(); 
proxy.Func1(); 
proxy.Close(); 

// Some other code 

proxy = new MyServiceClient(); // Recreate the client here 
proxy.Open(); 
proxy.Func2(); 
proxy.Close(); 
0

使用相同的代理在多個呼叫

MyServiceClient proxy = new MyServiceClient(); 
proxy.Open(); 
proxy.Func1(); 

// Some other code 

proxy.Func2(); 
proxy.Close(); 
0

正如其他人已經提到的,你應該擔心資源的確定性釋放調用Close()方法之後,但如果發生在Func1,2()方法Exception外部資源不會被髮布。

我建議你使用usingIDisposable模式,這意味着你想服務呼叫使用每次:

using(MyServiceClient proxy = new MyServiceClient()) 
{ 
    proxy.Func1(); 
} 

這就保證了所有的資源,甚至會,如果出現大括號內錯誤地釋放。或者您可以使用try, finally組合手動執行此操作。

3

WCF是.NET框架,你應該使用using語句實現IDisposable一個類的實例數(可能僅實例)之一。這個MSDN Article解釋了使用服務引用的正確模式。這也適用於從ChannelFactory創建的Channel實例。

+0

Geeze Louise。我同意,這是我見過的關於避免使用聲明的唯一地方。 'System.ObjectDisposedException' 無法訪問處置的對象。 對象名稱:'System.ServiceModel.Channels.ServerSessionPreambleConnectionReader + ServerFramingDuplexSessionChannel'。 在System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrNotOpen() 在System.ServiceModel.Channels.OutputChannel.Send(消息消息,時間跨度超時) 在System.ServiceModel.Channels.RequestContextBase.Reply(消息消息,時間跨度超時) – granadaCoder