2009-04-13 81 views
11

ObtenemosWCF Error El objeto de comunicación, System.ServiceModel.Channels.ServiceChanne, no se puede utilizar para la comunicación, ya que se encuentra en el estado de fallo

"El objeto de comunicación, System.ServiceModel.Channels.ServiceChannel, no puede ser utilizado para la comunicación porque está en estado de Falla ".

mensaje cuando cerramos la aplicación. ¿Alguien puede decirme cómo solucionarlo? Sabemos que es un canal de comunicación que intenta cerrar pero no puede cerrarse debido a un servicio no disponible o en estado de falla.

Todo lo que puedo decir es que, cuando el servicio no está disponible, pero el recolector de basura intenta destruir el objeto, los objetos de comunicación llaman a su función Cerrar servicio. Ahí obtenemos una excepción.

+0

No responderé ya que no puedo decirte POR QUÉ está fallado; pero siempre puedes verificar si está en estado de falla antes de intentar cerrarlo. – Will

Respuesta

12

Cuando hace una pregunta sobre una excepción, debe publicar toda la excepción, incluidas todas las instancias de InnerException. Usted debe detectar la excepción, ex.ToString pantalla(), y luego volver a lanzar la excepción de "tirar":

try { 
    // Do whatever causes the exception 
} catch (Exception ex) { 
    Console.WriteLine(ex.ToString()); // Or Debug.Print, or whatever 
    throw; // So exception propagation will continue 
} 

En este caso, me pregunto si tiene un usando bloque alrededor de su instanciación de proxy:

using (var proxy = new WcfProxyClient()) 
{ 
    // Use of proxy 
} 

Hay un defecto de diseño en WCF que hace de este el único lugar en .NET donde no se debe utilizar un usando bloque. En cambio, debes hacerlo a mano. Ver http://web.archive.org/web/20100703123454/http://old.iserviceoriented.com/blog/post/Indisposable+-+WCF+Gotcha+1.aspx.

Además, consulte "What is the best workaround for the WCF client using block issue?" y "Indisposable WCF clients".

+0

FYI - el enlace está roto. –

+0

@AlexR: Gracias. Se solucionó a través de Wayback Machine, y se agregaron dos enlaces más. –

0

Eche un vistazo al proyecto de proxies here.

Tuvimos un problema similar y esta técnica lo solucionó. Básicamente implica heredar de una clase que recreará automáticamente el canal si falla.

Cuestiones relacionadas