Como cerrar correctamente un proxy WCF

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”.

 

 

Tags:

WCF

Agregar comentario

  Country flag

biuquote
  • Comentario
  • Vista previa
Loading

Acerca de los Autores

Este es el blog del equipo de VEMN SA 
Presentaremos temas que nos parezcan de interés sobre tecnología .NET, Procesos y Metodologías y todo aquello relacionado con el proceso de desarrollo de Software

Month List

BlogRoll

Download OPML file OPML