2009-12-31 3 views
7

J'ai un client GUI qui s'exécute sur un service WCF hébergé en tant que service Windows sur un serveur. Le service WCF s'exécute dans PerCall InstanceContextMode, et le client a une instance singleton du client de service et je veux éviter de réinstancier le singleton à chaque appel car cela rend la vie difficile pour les nombreux appels asynchrones que j'ai.Traitement du redémarrage du service WCF côté client

Le problème pour moi est, après le service Windows redémarre, chaque fois que le client fait un appel, il reçoit un message d'exception comme ceci:

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

Quelle est la meilleure façon de le contourner? Je peux mettre des clauses try-catch autour de tous les appels au client de service et réinstancier l'instance de singleton sur les exceptions de communication mais cela impliquera beaucoup de code standard.

Répondre

9

Le mieux serait d'éviter les exceptions sur le serveur tous ensemble. Si un serveur WCF rencontre une exception qui n'est pas interceptée et gérée, il va "faucher" le canal, le rendant inutilisable. Côté serveur, vous pouvez implémenter le IErrorHandler interface et intercepter les exceptions .NET, en les transformant en erreurs SOAP qui seront restituées au client plus facilement, sans perturber le canal. De cette façon, vous pouvez capturer toutes les exceptions .NET sur le serveur et les convertir en erreurs SOAP interopérables qui ne causeront pas ces problèmes.

Pour plus d'informations, voir:

+0

merci, lisez ces documents et ils ont été d'une grande aide – theburningmonk

+5

Le problème avec cette exception de ProtocolException est que l'état de canal est toujours "ouvert", pas "Faulted", et il est très difficile de remarquer qu'il est en fait inutilisable. –

+2

Et que fait-on lorsque le service WCF est hébergé dans IIS et que, au lieu d'être redémarré en raison d'une exception, le service est redémarré pour avoir été redéployé? – alimbada

Questions connexes