Je travaille sur une application winform qui va accéder à un service WCF auto-hébergé en tant que service Windows. J'utilise ChannelFactory à la place de la référence de service. J'ai réussi à connecter et à appeler le service WCF. Le problème est lorsque je laisse l'application rester inactive pendant 20 minutes et ensuite essayer de faire un autre appel. Le message d'erreur suivant s'affiche:Meilleure pratique avec WCF ChannelFactory et délai de connexion
"La connexion au socket a été annulée, ce qui peut être dû à une erreur de traitement du message ou à un dépassement du délai de réception par l'hôte distant ou à un problème de ressource réseau sous-jacent. 00: 00: 59.9489970 '. " Je recherche la meilleure pratique pour gérer la connexion. J'ai actuellement créé une fonction appelée PrepareWCFConnection (voir ci-dessous) qui vérifie l'état du canal et le ChannelFactory. J'appelle cette méthode avant de faire des appels aux services de la WCF. Y a-t-il une meilleure façon de gérer cela?
public bool PrepareWCFConnection()
{
if ((channelFactory == null) ||
(channelFactory.State == CommunicationState.Faulted) ||
(channelFactory.State != CommunicationState.Opened))
{
channelFactory = new ChannelFactory<IService1>(new NetTcpBinding(), endpointAddress);
}
if ((proxy == null) ||
(((IClientChannel)proxy).State == CommunicationState.Faulted) ||
(((IClientChannel)proxy).State != CommunicationState.Opened))
{
proxy = channelFactory.CreateChannel(endpointAddress);
((IClientChannel)proxy).Open();
}
return true;
}
Plus de tests du code ci-dessus ont prouvé que cela ne fonctionnait pas. Le ChannelFactory et le canal sont ouverts mais je reçois toujours cette erreur après avoir laissé le système tourner au ralenti: la connexion du socket a été annulée. Cela peut être dû à une erreur de traitement de votre message ou à un dépassement de délai de réception de l'hôte distant ou à un problème de ressource réseau sous-jacent. Le délai d'attente de la socket locale était '00: 00: 59.9479970'. – econner
Voici un lien de MSDN qui montre la création du canal et de la chaîne, effectue les appels et ferme le canal, puis ferme la fabrique de canaux. Cependant, si vous utilisez des crédits pour vous authentifier, ne fermeriez-vous pas le canal après chaque appel de méthode et recréeriez le canal avant que chaque méthode soit coûteuse en ressources et en temps? http://msdn.microsoft.com/en-us/library/ms734681.aspx – econner
Après avoir testé plus, je commence d'abord l'appel au service WCF avec PrepareWCFConnection() ... puis appelez ma méthode de service, puis appelez ((IClientChannel) proxy) .Close(); Ceci ferme la connexion de canal et crée ensuite un nouveau canal pour chaque appel de méthode. Est-ce la meilleure pratique? – econner