Chiusura della connessione WCF
-
05-07-2019 - |
Domanda
Stiamo usando il servizio WCF
sul lato client stiamo pianificando di chiudere esplicitamente la connessione Sembra che ci sia più di un modo per chiudere
Sample1: Nel blocco infine del consumo di servizi WCF utilizzare
if (client.State == CommunicationState.Faulted)
{
client.Abort();
}
client.Close();
Dal momento che se il servizio è in stato di errore non saremo in grado di chiamare close ()
Sample2:
using(ClientProxy proxy = new ClientProxy())
{
//call your service methods
}
in sample2 non sono sicuro di cosa accadrà se il servizio è in stato di errore, genererà un errore durante la chiusura della connessione?
Soluzione
Il 2o campione usando " usando " il blocco non è corretto. Il blocco using garantisce che il metodo Dispose sia 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 / il sospetto sono assolutamente giusti. Sarebbe bello se il metodo Dispose proxy usasse il codice del tuo primo esempio, ma non è così che non usi il blocco using :)
Altri suggerimenti
Hai tutte le informazioni necessarie a portata di mano: le migliori pratiche risultanti da utilizzare e chiudere / interrompere correttamente tutti i proxy client WCF sarebbero:
YourClientProxy clientProxy = new YourClientProxy();
try
{
.. use your service
clientProxy.Close();
}
catch(FaultException)
{
clientProxy.Abort();
}
catch(CommunicationException)
{
clientProxy.Abort();
}
catch (TimeoutException)
{
clientProxy.Abort();
}
La cattura di FaultException gestisce tutti i casi in cui il servizio ha risposto con una condizione di errore (e quindi il tuo canale è in uno stato di errore) e CommunicationException gestirà tutte le altre eccezioni relative alla comunicazione che possono verificarsi, come la caduta della 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 catturarlo e gestirlo.
In Excellent di Juval Lowy Programmazione del libro WCF consiglia:
try
{
ClientProxy clientProxy = new ClientProxy();
clientProxy.SomeMethod();
clientProxy.Close();
}
catch
{
proxy.Abort();
}
Usa l'esempio 1
Ecco un buon articolo sul perché non dovresti usare usando: