Je travaille sur une application WinForm qui accédera à un service WCF auto-hébergé en tant que service Windows. J'utilise le canal-philicalisme au lieu de la référence de service. J'ai réussi à connecter et à appeler le service WCF. Le problème est que lorsque j'ai laissé l'application rester inactif pendant 20 minutes, puis essayez de faire un autre appel. Je reçois l'erreur suivante:
"La connexion à la prise a été abandonnée. Cela pourrait être causé par une erreur de traitement de votre message ou d'un délai de réception dépassé par l'hôte distant ou un problème de ressource de réseau sous-jacent. Le délai d'attente de la prise locale était inférieur. : 00: 59.9489970 '. " P>
Je cherche la meilleure pratique sur la gestion de la connexion. J'ai actuellement créé une fonction appelée préparerwcfconnection (voir ci-dessous) qui vérifie l'état du canal et la canalisation. 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? P>
3 Réponses :
Si vous souhaitez réutiliser un canal existant, vous devez garder la chaîne en vie en pingant le service toutes les 9 minutes. Je pense que le délai de réception par défaut est de 10 minutes, le canal sera donc débranché s'il est maintenu au-delà de cela. Ou vous pouvez utiliser des sessions fiables pour garder les canaux vivants. P>
Si vous n'avez pas besoin de rappeler sur le même canal, il est préférable de fermer le canal une fois que vous avez terminé et de recréer une nouvelle chaîne pour chaque opération de service.Il n'est pas coûteux pour créer des chaînes. Vous pouvez mettre en cache le canal. usine, mais créer des canaux pour chaque appel. P>
Bon point: Vous pouvez mettre en cache l'usine de canal, mais créer des canaux pour chaque appel i>.
Je sais que cette question est assez ancienne maintenant mais je vois que cela n'a pas vraiment répondu. Il y a deux délais (bien seulement 1 si vous n'utilisez pas de messagerie fiable), vous devez vous préoccuper de canaux. Sur le côté du service, vous avez le "recueil" qui est tiré si aucun message d'application n'est reçu dans la période de délai d'attente. La valeur par défaut de ce délai est de 10 minutes.
Il est également utilisé "InactivityTimeout" qui n'est utilisé que si "la répartition de la sortie" est activé. Ce délai d'attente est la durée maximale que le canal permet à l'autre partie de communication de ne pas envoyer de messages avant de défaut le canal. P>
Pour augmenter la durée de vie de votre canal, je vous recommande d'activer "la répartition de la session" puis de définir votre "ReceiveTimeOut" et "InactivitytimeOut" à une valeur supérieure. La reliacesession maintient la chaîne vivante en envoyant des messages d'ILM (messages de niveau d'infrastructure) tels que Keep-vivance (ACK est également envoyé). Si un service de conservation ou d'une ALM (Message de niveau d'application) n'est pas reçu avant l'expiration de «InactivityTimeout» expire le canal de défaut. P>
En outre si un message ALM (message d'application) n'a pas été reçu avant le " ReceivetimeOut "expire le canal défaut. P>
Donc, il est recommandé d'augmenter les délais d'attente de la même valeur ou de définir" la créancetime "sur une valeur plus élevée que" InactivityTimeout ". P> < P> Remarque latérale, le réglage de la "réceptionTimeOut" n'aura aucun effet lorsqu'il est défini sur le côté du client, il est un délai de service de service uniquement. Mais lors de l'utilisation de la répartition de la répartition du côté du service, le client doit également la mettre en œuvre comme suit: p> et l'app.config du côté du service ressemblerait à quelque chose comme ceci: < / p>
Une solution assez simple à l'avant pour réutiliser votre canal, sans sondage ou faire des trucs fantaisistes, il s'agit simplement de prendre soin du dernier appel à votre canal et de vérifier le WCFC.Binding.ReceIserTimeOut afin de le régénérer si nécessaire, quelque chose comme: < Pré> xxx pré> p>
Plus de test du code ci-dessus prouvé qu'il ne fonctionne pas. Le canal canal et canal sont ouverts, mais je reçois toujours cette erreur après avoir laissé le système rainet: la connexion à la prise a été abandonnée. Cela pourrait être causé par une erreur de traitement de votre message ou d'un délai de réception dépassé par l'hôte distant ou un problème de ressources réseau sous-jacent. Le délai d'attente local de la prise était '00: 00: 59.9479970 '.
Voici un lien de MSDN qui montre la création du canal canal et de la chaîne, de créer les appels et de fermer le canal, puis fermez l'usine de canal. Toutefois, si vous utilisez des crédits pour authentifier, ne fermez pas la fermeture du canal après chaque méthode appeler et recréer le canal avant que chaque méthode soit coûteuse sur les ressources et le temps? msdn.microsoft.com/en-us/library/ms734681.aspx
Après avoir testé davantage, je démarre d'abord l'appel au service WCF avec préparerwcfconnection () ... puis appelez ma méthode de service, puis appelez le proxy ((iClientChannel)) .close (); Cela ferme la connexion de canal puis crée un nouveau canal pour chaque appel de méthode. Est-ce la meilleure pratique?
Je fermerais toujours la chaîne après chaque appel. Si vous le gardez ouvert, mais inactif, vous recevrez une communicationFaultException après 10 minutes. Si vous voulez vraiment vous garder Canal Open, jetez un coup d'œil à la reliableservice. Ne fermez pas le canidien de canalisation, mais réutilisez-le car il effectue toute la configuration initiale.
Jetez un coup d'œil à ceci: codeproject.com/tips/ 507328 / Création de la Fermeture de WCF-PROX IES
Vient de voir que cela a environ un an.