por Emmanuel
17. marzo 2009
Teniendo en cuenta que un proxy WCF se deriva de ClientBase<TChannel>, y que éste implementa IDisposable, la mejor manera de utilizarlo pareciera ser:
try
{
using (var proxy = ProxyFactory.ObtenerProxy())
{
//Utilizar el proxy
}
}
catch (Exception ex)
{
throw;
}
Esta forma de utilización puede llevarnos a un error WCF cuando ocurre una excepción y el canal queda en estado “Faulted”, impidiendo cerrar el proxy.
Si accedemos por Reflection a la implementación de IDisposable observamos:
void IDisposable.Dispose()
{
this.Close();
}
Esta implementación no contempla el estado del proxy antes de llamar a Close(), de manera que ante cualquier error ocurrido al intentar cerrar el proxy recibiremos una excepción.
Una manera de corregir este comportamiento es creando una extensión:
public static void CloseExt(this SvcClient proxy)
{
if (proxy != null)
{
var checkClosedState =
CommunicationState.Closed | CommunicationState.Closing;
if (proxy.State == CommunicationState.Faulted)
{
proxy.Abort();
}
else if (proxy.State != checkClosedState)
{
proxy.Close();
}
}
}
Y para utilizar la extensión el código se modificaría a:
SvcClient proxy = null;
try
{
proxy = ProxyFactory.ObtenerProxy;
//Utilizar el proxy
}
catch (Exception)
{
throw;
}
finally
{
proxy.CloseExt();
}
De esta manera siempre se llama a la extensión CloseExt(), la que se encarga de cerrar o abortar el proxy según su estado, impidiendo que se genere una excepción por intentar cerrar un proxy en estado “Faulted”.
ee24d7f0-de6b-4ce2-98b9-49029af5e0b8|0|.0
Tags: wcf
WCF