Je développe une application client/serveur dans .Net 3.5 en utilisant WCF. Fondamentalement, un service client de longue durée (sur plusieurs machines) établit une connexion duplex au serveur via un netTcpBinding. Le serveur utilise ensuite le contrat de rappel du client pour effectuer certaines opérations à la demande, auxquelles le client répond de manière asynchrone (ce qui est assez standard, je pense). Je sous-classe la classe DuplexClientBase pour gérer la plupart des communications.Comment rétablir automatiquement un canal duplex en cas de panne?
Malheureusement, quand quelque chose va mal à chaque extrémité (comme une défaillance du réseau, exception inattendue, etc.), le canal se reprocher/avorté et toutes les opérations ultérieures échouent. J'ai contourné cette limitation dans les canaux non-duplex en créant une classe RecoveringClientBase qui prend automatiquement en charge lorsque le client a bloqué et réessaye l'opération.
Donc ma question est, est-il un moyen établi de déterminer quand un canal duplex est en défaut? Où dois-je vérifier ceci, sur le serveur ou le client? A défaut, quelles options ai-je pour faire en sorte que la connexion soit rétablie?
Mise à jour: Je recherche des conseils spécifiques aux canaux duplex, où le serveur pourrait essayer d'utiliser un canal de rappel défectueux. Ainsi, j'ai besoin de quelque chose qui se reconnectera/se réabrènera immédiatement quand quelque chose arrivera à la chaîne. En ce moment, j'écoute l'événement Closing de la chaîne et je le recrée si l'état est tout sauf fermé. Il fonctionne en quelque sorte, mais il se sent aki ...
Pouvez-vous fournir un exemple de cela? L'article suggère simplement l'idée, mais ne donne aucune idée quant à la mise en œuvre. – Jacob
+1 Jacob. Quelqu'un at-il des informations sur la façon de faire ce travail? J'ai actuellement dû utiliser le proxy dynamique Castle pour implémenter mon comportement de reconnexion, mais je préfèrerais plutôt ajouter ce comportement via Wcf. Je lis divers blogs Wcf mais il est impénétrable et je n'ai aucune idée par où commencer - même les extensions simples semblent nécessiter de créer des tas de classes et des ramifications de configuration - c'est déconcertant. –
Ajoutez un gestionnaire d'événement à l'événement Faulted via l'interface ICommunicationObject explicite de votre service. Dans le gestionnaire d'événements, Abandonnez() le canal et créez un nouveau canal. – Jakub