Je reproché essaie de mettre en œuvre une logique de rebranchement pour un client WCF. Je suis conscient que vous devez créer un nouveau canal après que le canal actuel est entré dans l'état défectueux. Je l'ai fait dans un gestionnaire d'événements en défaut de canal:WCF canal Callback
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();
}
}
Mais dans mon test unitaire je reçois toujours un « L'objet de communication, System.ServiceModel.Channels.ServiceChannel, ne peut pas être utilisé pour la communication car il est dans le Faulted état "exception".
Est-il possible que le canal de rappel est toujours en défaut et si oui comment puis-je remplacer le canal de rappel?
Pourriez-vous préciser ce que fait votre test unitaire lorsqu'il déclenche l'exception? –
Dans mon test unitaire, je crée un hôte de service et une instance de client. J'inscris le client sur le service et ensuite j'arrête le service en mettant la référence à null. Après cela, j'attends 20 secondes (j'utilise une session fiable avec un InactivityTimeout de 10 secondes, donc je suis sûr que la connexion est perdue après 20 secondes) puis j'appelle la méthode DoSomething() sur le client. Maintenant, je recréer le service et attendre le client à se reconnecter. En ce moment, j'ai l'exception. – phatoni