svcutil - wcf tutorial
Cierre de conexión WCF (4)
Estamos usando 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
Sample1: en el bloque finally del uso de consumo del servicio WCF
if (client.State == CommunicationState.Faulted)
{
client.Abort();
}
client.Close();
Dado que si el servicio está en estado de falla, no podremos llamar a close ()
Sample2:
using(ClientProxy proxy = new ClientProxy())
{
//call your service methods
}
en la muestra2 no estoy seguro de qué sucederá si el servicio está en estado de falla, ¿arrojará un error al cerrar la conexión?
En el excelente libro de WCF de Programación de Juval Lowy, él recomienda:
try
{
ClientProxy clientProxy = new ClientProxy();
clientProxy.SomeMethod();
clientProxy.Close();
}
catch
{
proxy.Abort();
}
La 2da muestra que usa el bloque "usar" es incorrecta. El bloque que usa garantiza que se llama al método Dispose en el objeto proxy. El método Dispose a su vez llama al método Close que intentará (intentará) conectarse al servicio, lo que arrojará una excepción cuando el estado de comunicación tenga una falla. Entonces tus sentimientos / presentimientos son absolutamente correctos. Sería bueno si el método de eliminación de proxy utiliza el código de su primera muestra, pero no lo hace, no use el bloque de uso :)
Usa la muestra 1
Aquí hay un buen artículo sobre por qué no debes usar usando:
Usted tiene toda la información necesaria a mano: la mejor práctica resultante para utilizar y cerrar / abortar correctamente todos sus proxies de cliente 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();
}
Capturando FaultException maneja todos los casos cuando el servicio responde con una condición de error (y por lo tanto su canal está en estado de falla), y CommunicationException manejará todas las demás excepciones relacionadas con la comunicación que puedan ocurrir, como caída de conectividad de red, etc.
El enfoque con el bloque using () no funcionará, ya que si ocurre una excepción al final del bloque, cuando el método Dispose () llama al método Close () en el proxy del cliente, no tiene forma de capturar y manejar ese.