2009-09-09 10 views
24

Stiamo utilizzando servizio WCFChiusura connessione WCF

sul lato client stiamo progettando di chiudere esplicitamente la connessione Sembra che ci siano più di un modo di chiudere

Sample1: Nel blocco finally di il consumo servizio WCF utilizzare

if (client.State == CommunicationState.Faulted) 
{ 
    client.Abort(); 
} 
client.Close(); 

Poiché se il servizio è in stato di anomalia non saremo in grado di chiamare close()

Sample2:

using(ClientProxy proxy = new ClientProxy()) 
{ 
    //call your service methods 
} 

in sample2 io non sono sicuro di cosa accadrà se il servizio è in stato di errore, si è buttare errore di chiudere la connessione?

+0

@ Balaji- un'occhiata a questo post http://stackoverflow.com/questions/573872/what-is-the-best-workaround- for-the-wcf-client-using-block-issue. È più utile – RichardOD

risposta

16

Il secondo campione che utilizza il blocco "using" non è corretto. Il blocco using assicura che il metodo Dispose venga chiamato sull'oggetto proxy. Il metodo Dispose a sua volta chiama il metodo Close che tenterà di connettersi al servizio che genererà un'eccezione quando lo stato della comunicazione è in errore. Quindi i tuoi sentimenti/sensazioni sono assolutamente giusti. Sarebbe bello se il proxy Smaltire il metodo utilizzato il codice dal tuo primo campione, ma non in modo da non utilizzare il blocco utilizzando :)

34

avete tutte le informazioni necessarie a portata di mano - il conseguente Best Practice da utilizzare e correttamente vicino/annullare tutte le vostre client proxy WCF sarebbero:

YourClientProxy clientProxy = new YourClientProxy(); 

try 
{ 
    .. use your service 
    clientProxy.Close(); 
} 
catch(FaultException) 
{ 
    clientProxy.Abort(); 
} 
catch(CommunicationException) 
{ 
    clientProxy.Abort(); 
} 
catch (TimeoutException) 
{ 
    clientProxy.Abort(); 
} 

Catching the FaultException gestisce tutti i casi in cui il servizio risponde con una condizione di errore (e quindi il canale si trova in uno stato di errore) e CommunicationException gestirà tutte le altre eccezioni relative alla comunicazione che possono verificarsi, come la connettività di rete, ecc.

L'approccio con il blocco using() non funzionerà, poiché se si verifica un'eccezione alla fine del blocco, quando il metodo Dispose() chiama il metodo Close() sul proxy client, non è possibile catturandolo e maneggiandolo.

+0

Grazie a tutti per la risposta. Vorrei che ci fossero alcune impostazioni nel file web.config per occuparsi della chiusura della connessione! – Balaji

+1

FaultException è CommunicationException, quindi tecnicamente non sono necessarie entrambe le clausole catch (a meno che non si preveda di gestire i due casi in modo diverso). – bobbymcr

+0

FaultException è un discendente di CommunicationException e hai ragione: gestire semplicemente CommunicationException sarebbe ok, a patto che non sia necessario in qualche modo fare cose diverse per i due diversi casi. Immagino sia solo mia abitudine elencare separatamente i tipi di eccezioni più comuni, anche se non faccio nulla di speciale in nessuno dei due ..... –

4

In di Juval Lowy eccellente Programming WCF book egli raccomanda:

try 
{ 
    ClientProxy clientProxy = new ClientProxy(); 
    clientProxy.SomeMethod(); 
    clientProxy.Close(); 
} 
catch 
{ 
    proxy.Abort(); 
} 
+2

Ha .. Ho visto quel codice nel libro, ma penso che non sia compilato. Il servizio deve essere dichiarato al di fuori del blocco try a cui si accede nel blocco catch ... e quindi probabilmente si desidera eseguire un controllo nullo intorno ad esso. – foson

+0

@ foson- sai in quale pagina si trovava? Hai ragione riguardo al codice sopra. Ho il libro ma leggo un po 'di tempo fa. – RichardOD

Problemi correlati