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?

È stato utile?

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:

http://msdn.microsoft.com/en-us/library /aa355056.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top