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?
¿Podría especificar qué hace su prueba de unidad cuando desencadena la excepción? –
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