Crad's .NET Blog

L'UGIblog di Marco De Sanctis
posts - 190, comments - 457, trackbacks - 70

[WCF] Attenzione alle Using

In Windows Communication Foundation, il proxy creato da svcutil eredita dalla classe ClientBase<T>, che a sua volta implementa l'interfaccia IDisposable. Conseguenza di questo fatto è che viene naturale invocare il nostro bel servizio scrivendo:

using (MyServiceClient client = new MyServiceClient()) { // more code goes here... }

Ma se l'invocazione genera un errore, cosa accade? L'utilizzo del blocco using ci garantisce che venga chiamato il metodo Dispose() di MyServiceClient, che, Reflector alla mano, non fa altro che invocarne il metodo Close().

Attenzione però all'eccezione rilanciata se lo stato del client è Faulted (accade ogni volta che si verifica un errore non recuperabile, ad es. il server ha chiuso la connessione): in questo caso, infatti, al posto di Close andrebbe invocato il metodo Abort. L'uso di Close determina il sollevarsi di una CommunicationObjectFaultedException che oscura completamente l'errore verificatosi all'interno del blocco using.

Per ovviare a questo problema, ho costruito una classe helper che chiude il client in maniera un po' più furba:

public class SafeClose: IDisposable { private ICommunicationObject communicationObject; public SafeClose(ICommunicationObject co) { communicationObject = co; } public void Dispose() { try { if (communicationObject.State != CommunicationState.Faulted) communicationObject.Close(); } catch { communicationObject.Abort(); } } }

La sintassi di utilizzo è solo di poco più prolissa:

MyServiceClient client; using (new SafeClose(client = new MyServiceClient())) { Console.WriteLine(client.MyMethod()); }

HTH.

Ciao smile_wink

Print | posted on domenica 4 marzo 2007 19:27 | Filed Under [ .Net 3.0 ]

Powered by:
Powered By Subtext Powered By ASP.NET