2013-09-23 3 views
5

Używam następujący kod do wywołania metody usługi WCFnie można uzyskać dostępu do obiektu wyjątku usytuowaną w WCF

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

proxy.Close(); 

otrzymuję wyjątek podczas wywoływania „proxy.Open()” po raz drugi, ale czasami działa kod . Mogę również użyć poniższego kodu pokazanego poniżej, który działa poprawnie.

MyServiceClient proxy = new MyServiceClient(); 

proxy.Func1(); 

// Some other code 

proxy.Func2(); 

proxy.Close(); 

Chcę również wiedzieć, który jest lepszy sposób wywoływania funkcji. Które podejście da lepszą wydajność?

+0

Może właśnie usunąłeś to, aby uprościć, ale powinieneś używać 'finally', aby zawsze zamykać otwarte zasoby. –

Odpowiedz

7

Po zamknięciu połączenia nie można go ponownie użyć.

W tym miejscu należy wykonać nową 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

Użyj tego samego serwera proxy na wiele połączeń

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

// Some other code 

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

Jak inni już wspomniano należy martwić deterministycznego uwolnienia zasobów po wywołaniu Close() metody, ale jeśli Exception występuje w Func1,2() metod zasobów zewnętrznych nie będzie być uwolnionym.

Proponuję użyć using i IDisposable wzór, co oznacza, że ​​za każdym razem chcesz skorzystać rozmowę usługę:

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

który gwarantuje, że wszystkie środki zostaną uwolnione, nawet jeśli coś pójdzie nie tak w ciągu szelkami. Lub możesz to zrobić ręcznie za pomocą kombinacji try, finally.

3

WCF jest jednym z kilku instancji (ewentualnie tylko przykład), w ramach .NET, gdzie należy NIE użyć instrukcji using z klasy, która implementuje IDisposable. Ten MSDN Article wyjaśnia prawidłowy wzorzec do korzystania z referencji usług. Dotyczy to również instancji Channel utworzonych od ChannelFactory.

+0

Geeze Louise. Zgadzam się, to jest TYLKO miejsce, w którym widziałem, jak Microsoft pisze o tym, aby uniknąć użycia instrukcji. "System.ObjectDisposedException" Nie można uzyskać dostępu do unieszkodliwionego obiektu. Nazwa obiektu: "System.ServiceModel.Channels.ServerSessionPreambleConnectionReader + ServerFramingDuplexSessionChannel". na System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrNotOpen() w System.ServiceModel.Channels.OutputChannel.Send (wiadomosc, limit czasu TimeSpan) w System.ServiceModel.Channels.RequestContextBase.Reply (wiadomosc, limit czasu TimeSpan) – granadaCoder