2010-01-23 7 views
4

Je suis un peu perplexe avec celui-ci, et j'espérais pouvoir trouver des réponses ici.La communication WCF entre deux serveurs se bloque après le processus de recyclage IIS7

Fondamentalement, j'ai une application ASP.NET qui fonctionne sur 2 serveurs. Le serveur A a toute la logique métier/accès aux données exposée en tant que services Web, et le serveur B a le site Web qui parle à ces services (via WCF, avec la liaison net.tcp).

Le problème se produit quelques secondes après le démarrage d'un recyclage de mon pool d'applications par IIS sur le serveur A. Le recyclage se produit après le délai imparti (en utilisant la valeur par défaut de 29 heures définie dans IIS).

Dans le journal du serveur (du serveur A):

Un processus de travail avec l'identifiant du processus '####' pool d'applications au service 'AppPoolName' a demandé un recyclage parce que le processus de travail atteint son délai de traitement autorisé.

Je crois que c'est un comportement normal. Le problème est que quelques secondes plus tard, je reçois cette exception sur le serveur B:

Ce canal ne peut plus être utilisé pour envoyer des messages comme la session de sortie a été fermée automatiquement en raison d'un initié serveur fermer. désactive la fermeture automatique en définissant DispatchRuntime.AutomaticInputSessionShutdown sur false, ou modifiez le protocole d'arrêt avec le serveur distant .

Cela ne se produit pas à chaque recyclage; Je suppose que cela arrive quand quelqu'un frappe le site avec une demande PENDANT que le recyclage se produit.

En outre, mon application est en panne jusqu'à ce que j'intervienne; cette exception continue de se produire chaque fois qu'une requête ultérieure est effectuée sur la page. J'interviens en éditant le web.config (en ajoutant un espace ou quelque chose de bénin à la fin du fichier) et en l'enregistrant - je suppose que cela provoque la recompilation de mon application et la restauration des services. J'ai aussi expérimenté avec l'exécution d'un fichier séquentiel qui fait cela pour moi chaque fois que l'exception se produit;)

Maintenant, je pouvais à peine trouver des informations sur cette exception, et j'ai cherché pendant un moment. La plupart des informations que j'ai trouvées se rapportent aux paramètres WCF que je n'utilise pas.

J'ai déjà lu sur "DispatchRuntime.AutomaticInputSessionShutdown" et je ne pense pas que cela se rapporte à cette situation. Cette propriété particulière fait référence à l'arrêt automatique du service en réponse au comportement côté client, ce qui n'est pas le cas ici. Ici, le service est arrêté à cause d'IIS. J'ai lu this qui a fait l'objet d'un certain travail pour rétablir le service automatiquement, mais je cherche vraiment à comprendre ce qui se passe ici, pas à le contourner!

J'ai commencé à jouer avec les paramètres de IIS7, en activant/désactivant spécifiquement le recyclage superposé et en augmentant les temps de démarrage et d'arrêt du processus. Je me demande s'il est sûr d'arrêter complètement le recyclage (je crois que si je mets 0 pour l'intervalle de temps de recyclage?) Mais encore une fois, je veux savoir ce qui se passe!

De toute façon, si vous avez besoin de plus d'informations, faites le moi savoir. Merci d'avance!

+0

Je suis confronté au même problème. Avez-vous trouvé une solution? La réponse acceptée ne semble pas être la solution pour moi. –

Répondre

4

Ceci est probablement lié à la manière dont vous ouvrez et fermez les connexions WCF.

Si vous ouvrez un proxy lorsque votre application démarre et que vous continuez à l'utiliser, une interruption de la connexion est provoquée par un redémarrage côté serveur. Résultats dans une erreur du côté client, car le serveur avec lequel le proxy parlait n'est plus là. Lorsque vous redémarrez le côté client (en modifiant le fichier web.config), de nouveaux proxys sont créés sur un serveur en cours d'exécution.

La façon de résoudre ce problème est de s'assurer que vous fermez une connexion WCF après l'avoir utilisée.

http://www.codeguru.com/csharp/.net/net_wcf/article.php/c15941/

+0

Je pensais que tout avait l'air Ok la dernière fois que j'ai vérifié, mais je vais vérifier que je ferme mes connexions. Je reviendrai vers toi. – donnovan9

+0

Je ne sais pas si c'est ce qui causait le problème exact, mais il y a un problème avec la façon dont je ferme le canal - utilisait une classe proxy personnalisée (qui a hérité de RealProxy). Je vais réécrire le code et voir ce qui se passe, à temps je serai en mesure de dire si cela l'a corrigé. Merci mec! – donnovan9

+0

@Konrad pouvez-vous partager comment vous avez résolu le problème? –

0

Vous devez également vous assurer que vous utilisez le SessionMode correct pour votre service Web. Je me souviens d'avoir eu des problèmes similaires avec certains de mes services jusqu'à ce que j'ai réglé le bon mode. Cela est particulièrement vrai lorsque vous mixez ceci avec tout autre mode d'authentification qui n'est pas "Aucun".

Ce lien peut contenir un pointeur.

http://msdn.microsoft.com/en-us/library/ms731193.aspx

+0

C'est bizarre, on dirait que l'un de mes services a son InstanceContextMode réglé sur "Single" ... tous les autres sont "PerCall". Cela pourrait éventuellement être le problème. – donnovan9

+0

Exactement le problème que nous avions. Le mode Single Instance semble définir un contexte "unique". Lorsque vous redémarrez le pool d'applications, il redémarre ce contexte, mais votre client ne le connaît pas. Il envoie donc un nouvel appel avec le contexte actuel, au lieu d'en demander un nouveau, et donc l'erreur. –

0

Ma suggestion est d'arrêter tout simplement en utilisant IIS pour héberger vos services. À moins qu'il y ait quelque chose dont vous avez réellement besoin d'IIS, je vous recommande d'écrire un service Windows standard pour héberger vos points de terminaison WCF.

Si vous ne pouvez pas faire cela, alors, par tous les moyens, désactivez le recyclage. AppPool recyclage est principalement là parce que les développeurs web écrivent du code merdique. Je sais que cela semble plutôt direct, mais si vous avez assez de sens pour écrire du code qui ne fuit pas, il n'y a aucune raison pour que IIS redémarre constamment votre programme.

+0

La première option n'est pas possible dans ma situation, mais la seconde me semble de plus en plus attrayante :) – donnovan9

Questions connexes