2009-10-12 14 views
7

Estoy tratando de implementar una lógica de reconexión para un cliente wcf. Soy consciente de que tienes que crear un nuevo canal después de que el canal actual ingresó en estado de falla. Hice esto en un canal con fallo controlador de eventos:WCF Callback channel fault


internal class ServiceClient : DuplexClientBase, IServiceClient 
{ 
    public ServiceClient(ICallback callback, EndpointAddress serviceAddress) 
    : base(callback, MyUtility.GetServiceBinding("NetTcpBinding"), serviceAddress) 
    { 
    // Open the connection. 
    Open(); 
    } 

    public void Register(string clientName) 
    { 
    // register to service 
    } 

    public void DoSomething() 
    { 
    // some code 
    } 
} 

public class ClientApp 
{ 
    private IServiceClient mServiceClient; 

    private ICallback mCallback; 

    public ClientApp() 
    { 
    mServiceClient = new ServiceClient(mCallback, new EndpointAddress("someAddress")); 

    mServiceClient.Register(); 

    // register faulted event for the service client 
    ((ICommunicationObject)mServiceClient).Faulted += new EventHandler(ServiceClient_Faulted); 
    } 

    void ServiceClient_Faulted(object sender, EventArgs e) 
    { 
    // Create new Service Client. 
    mServiceClient = new ServiceClient(mCallback, new EndpointAddress("someAddress")); 

    // Register the EI at Cell Controller 
    mServiceClient.Register(); 
    } 

    public void DoSomething() 
    { 
    mServiceClient.DoSomething(); 
    } 
} 

Pero en mi unidad de prueba todavía consigo un "El objeto de comunicación, System.ServiceModel.Channels.ServiceChannel, no puede ser utilizado para la comunicación, ya que se encuentra en la Faulted estado "excepción".

¿Es posible que el canal de devolución de llamada aún tenga una falla y, en caso afirmativo, cómo puedo reemplazar el canal de devolución de llamada?

+0

¿Podría especificar qué hace su prueba de unidad cuando desencadena la excepción? –

+0

En mi prueba de unidad, creo un servidor de servicio y una instancia de cliente. Registro el cliente en el servicio y luego dejo el servicio configurando la referencia a nulo. Después de eso, espero 20 segundos (estoy usando una sesión confiable con InactivityTimeout de 10 segundos, así que estoy seguro de que la conexión se pierde después de 20 segundos) y luego llamo al método DoSomething() en el cliente. Ahora recreé el servicio y espero que el cliente se vuelva a conectar. En ese momento recibo la excepción. – phatoni

Respuesta

5

Hasta ahora he experimentado que una conexión WCF debe recrearse por error; de lo contrario, no parece haber una manera de recuperarla. En cuanto a cuándo ocurre una falla, el método parece dispararse bien, pero a menudo dispara y limpia la conexión WCF (estableciendo una nueva, etc.) mientras se realiza la solicitud actual, lo que hace que falle, especialmente en tiempos de espera excedidos.

Un par de sugerencias: - Si está relacionado con el tiempo de espera, lleve un registro de la última vez que se realizó una llamada y una constante que contiene el valor de tiempo de espera. Si la conexión WCF se habrá interrumpido debido a la inactividad, suéltelo y recíclelo antes de, envíe la solicitud por el cable. - Por otro lado, parece que no está volviendo a agregar el manejador de fallas, lo que significa que se procesará la primera falla, pero la segunda vez que falle caerá sin un controlador porque no se ha conectado una nueva.

Espero que esto ayude

0

¿Ha intentado restablecer el canal de comunicaciones llamando a mServiceClient.Abort en el controlador de eventos Faulted?

Editar:

veo que no reinicializar el objeto mCallback en su código de recuperación. Es posible que deba asignarlo a una nueva instancia.

+0

Gracias por su ayuda. Sí, lo intenté antes, pero no ayudó mucho porque recibí una excepción "El objeto de comunicación, System.ServiceModel.Channels.ServiceChannel, no se puede utilizar para la comunicación porque está en el estado abortado" en lugar de lo mencionado anteriormente excepción. – phatoni