Pregunta

Estamos utilizando el servicio WCF

en el lado del cliente, estamos planeando cerrar explícitamente la conexión Parece que hay más de una forma de cerrar

Muestra 1: En el bloque finalmente del consumo de servicio WCF uso

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

Ya que si el servicio está en estado de falla, no podremos llamar a close ()

Muestra2:

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

en sample2 no estoy seguro de qué ocurrirá si el servicio está en estado de falla, ¿producirá un error al cerrar la conexión?

¿Fue útil?

Solución

La segunda muestra utilizando " utilizando " el bloque es incorrecto El bloque de uso garantiza que se llame al método Dispose en el objeto proxy. A su vez, el método Dispose llama al método Close, que intentará conectarse al servicio, lo que generará una excepción cuando se produzca un error en el estado de comunicación. Así que tus sentimientos / corazonada son absolutamente correctos. Sería bueno que el método proxy Dispose usara el código de su primera muestra, pero no lo hace, por lo que no usa el bloque de uso :)

Otros consejos

Tiene a mano toda la información necesaria: la mejor práctica resultante para usar y cerrar / abortar adecuadamente todos sus servidores proxy de WCF sería:

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 se encarga de todos los casos en que el servicio responde a una condición de error (y, por lo tanto, su canal se encuentra en estado de falla), y CommunicationException manejará todas las demás excepciones relacionadas con la comunicación que puedan ocurrir, como la caída de la conectividad de la red, etc.

El enfoque con el bloque using () no funcionará, ya que si una excepción ocurre al final del bloque, cuando el método Dispose () llama al método Close () en el proxy del cliente, no tiene forma de atrapando y manejando eso.

En Juval Lowy's, Excellent Programación WCF libro que él recomienda:

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

Use la muestra 1

Aquí hay un buen artículo sobre por qué no debe usar el uso:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top