2009-08-16 7 views
1

Quel est le problème avec CommunicationExceptions dans un système utilisant WCF? J'ai un client communiquant avec un serveur via WCF en utilisant SOAP - toutes les communications asynchrones. De temps en temps, je reçois une CommunicationException sur mon visage - sans voir aucun motif reproductible sur pourquoi et quand cela arrive.WCF - "CommunicationException n'a pas été gérée par le code utilisateur"

Cependant; Je suis capable de continuer à exécuter le programme car il ne s'agit que d'une première chance (?). Par conséquent je suppose que je n'ai pas à m'inquiéter à ce sujet, et qu'il est manipulé derrière la scène? Mais je suis toujours inquiet, et ce serait bien si quelqu'un pouvait m'éclairer là-dessus. Devrais-je essayer-attraper pour CommunicationException chaque endroit que j'appelle une fonction à travers WCF?

+1

Voyez-vous cette exception dans le débogueur? Alors ne vous inquiétez pas à ce sujet - c'est une exception de la première chance, et sera probablement manipulé. –

+0

Oui - dans le débogueur. Et oui - semble être une exception première chance que je peux continuer à exécuter le programme après. Alors; pas de soucis alors? Dites juste à VisualStudio de cesser de me déranger à propos de telles exceptions ..? – stiank81

Répondre

2

Le CommunicationException est le type de base pour tous les problèmes liés à la WCF et peuvent apparaître au niveau du client dans une multitude de cas:

  • lorsque votre client par exemple demande une URL qui n'est pas disponible
  • lorsque votre serveur est trop occupé et ne peut pas gérer d'autres demandes et rejette une demande
  • quand quelque chose va mal sur le réseau entre le client et le serveur (connexion a été interrompue, etc.)

Si vous avez ces pop-up fréquemment, vous devrez vérifier de plus près si elles sont vraiment CommunicationException ou un type dérivé (FaultException et beaucoup plus).

A FaultException serait une indication que quelque chose sur le serveur a mal tourné - il sera levée si le serveur a la demande, mais ne pouvait pas gérer correctement et renvoyé une exception ou une erreur SOAP.

Avez-vous noté ce que le message de l'exception était, et s'il y avait InnerException?

Marc

+0

Thx! Si je vous ai bien compris, cela signifie que je devrais essayer d'attraper CommunicationException à chaque appel MyFunctionAsync() côté client. Mais je suppose qu'il n'est pas nécessaire de le faire sur le serveur? Dans mon cas, cela n'arrive pas souvent. Prend un moment d'envoyer des demandes fréquentes jusqu'à ce que je suis capable de reproduire. L'exception indique "NotFound" et l'exception InnerException à une exception WebException.Seulement obtenir cela comme une exception de première chance en mode débogage .. – stiank81

+0

Oui, sur le client, je mettrais définitivement mes appels de service dans try..catch. Du côté serveur, vous devrez vérifier dans l'interface IErrorHandler et implémenter cela sur votre classe de service pour attraper toutes les exceptions qui se produisent sur le serveur et les convertir en erreurs SOAP pour être totalement "clean" ;-) –

+0

Thx! Sera à l'affût des éventuelles exceptions côté serveur et les convertira s'il y en a. – stiank81

0

Vous pouvez essayer quelque chose comme ceci:

+0

Ajouté cela du côté client, mais l'exception n'a jamais atteint le client car il s'agit d'une exception de première chance. Mais devrait-on en général essayer d'attraper de telles exceptions lors de l'utilisation de WCF, ou puis-je supposer qu'aucune exception de type communication n'est levée? – stiank81

+0

Vous devriez également attraper l'exception du côté serveur et la lancer comme une exception de faute si vous avez besoin d'envoyer une exception au client. Les exceptions d'erreur renvoyées doivent être spécifiées dans le contrat WCF. –

+0

Vraiment? Je dois faire cela sur tout, au cas où il y aurait une exception de communication quelconque? J'espérais que la WCF s'occuperait de ça pour moi. J'ai essayé d'attraper l'exception des deux côtés, mais cela ne change rien. Toujours juste voir l'exception de la première chance - qui est dans le EndMyServiceFunc() dans le référencé autogénéré. Mais vous dites qu'il y a une chance que cela puisse exploser à un moment donné si je ne gère pas de telles exceptions? – stiank81

Questions connexes