Le meilleur moyen d'attraper une exception WCF dans Silverlight?
J'ai une application Silverlight 2 qui est de la consommation d'un service WCF. En tant que tel, il utilise des rappels asynchrones pour tous les appels aux méthodes du service. Si le service n'est pas en cours d'exécution, ou il se bloque, ou le réseau tombe en panne, etc avant ou au cours de l'un de ces appels, une exception est générée comme vous le souhaitez. Le problème est, je ne sais pas comment récupérer cette exception.
- Parce que c'est un appel asynchrone, je ne peux pas me faire commencer appel avec un bloc try/catch et avoir ramasser une exception qui se produit après que le programme a évolué à partir de ce point.
- Parce que le proxy du service est générée automatiquement, je ne peux pas mettre un bloc try/catch sur chaque générée fonction qui s'appelle EndInvoke (où l'exception s'affiche en fait). Ces généré fonctions sont également entouré par un Code Externe, dans la pile d'appel, donc il n'y a nulle part d'autre dans la pile de mettre un try/catch.
- Je ne peux pas mettre le try/catch dans mes fonctions de rappel, parce que l'exception se produit avant qu'ils ne se appelé.
- Il y a un Application_UnhandledException fonction de mon Application.xaml.cs, qui capture toutes les exceptions non gérées. J'ai pu l'utiliser, mais il semble comme un malpropre façon de le faire. Je préfère réserver cette fonction pour la vraiment des erreurs inattendues (aka bugs) et finissent pas avec le code de cette fonction pour chaque circonstance, je voudrais traiter de manière spécifique.
Ai-je raté une solution évidente? Ou suis-je coincé à l'aide de Application_UnhandledException?
[Modifier]
Comme mentionné ci-dessous, l'Erreur de la propriété est exactement ce que je cherchais. Qu'est-ce que me lancer pour une boucle, c'est que le fait que l'exception est levée, et semble être interceptée, mais l'exécution est en mesure de continuer. Il déclenche la Application_UnhandledException de l'événement et les causes de VS2008 de briser l'exécution, mais qui continue dans le débogueur permet l'exécution continue. Ce n'est pas vraiment un problème, il semble juste bizarre.
source d'informationauteur wahrhaft
Vous devez vous connecter pour publier un commentaire.
Je vérifier l'Erreur de la propriété de l'événement args dans la méthode de service rempli de gestionnaire d'événements. Je n'ai pas eu de problèmes avec le gestionnaire d'événement n'est pas appelée. Dans le cas où le serveur tombe en panne, l'appel prend que quelques secondes, puis revient avec une ProtocolException dans l'Erreur de la propriété.
En supposant que vous avez essayé et votre rappel vraiment n'est jamais appelée, vous pouvez regarder dans la personnalisation de l'généré de la classe proxy. Voir cet article.
J'ai trouvé un fil de discussion du forum qui a parlé de cela, et il mentionne que la meilleure pratique consiste à utiliser l'Erreur de la propriété. Entre ce fil et de mes propres expériences, c'est ce que je peux en conclure:
Dans des conditions normales .NET code, le proxy généré classe gère l'exception correctement en mettant l'exception de l'Erreur de la propriété au lieu de la jeter.
Dans Silverlight, le proxy généré classe définit l'Erreur de propriété, mais ne gère pas l'exception complètement. L'exception est capté par le débogueur, qui apparaît à l'exception de la boîte avec le message "ProtocolException a été gérée par le code de l'utilisateur". En dépit de ce message, l'exception ne semblent effectivement se rendre à l'Application_UnhandledException fonction.
Je m'attends que c'est l'une des choses qu'ils vont corrigé dans la version finale.
Pour l'instant, je vais utiliser la propriété Error et simplement de traiter avec le débogueur de rupture de l'exécution. Si elle devient trop gênant, je peux éteindre la pause sur une exception pour ProtocolException.
Vous pouvez oublier Application_UnhandledException sur asyn rappels de client, pourquoi:
Application_UnhandledException seules exceptions ont tiré sur le thread de l'INTERFACE utilisateur peut être interceptée par l'Application.UnhandledExceptions
Cela signifie... pas appelée du tout pour un WCF appel asynchrone :-).
Vérifier la réponse détaillée de MSFT
http://silverlight.net/forums/t/21828.aspx
Bonjour, les seules exceptions ont tiré sur le thread de l'INTERFACE utilisateur peut être interceptée par l'Application.UnhandledExceptions. Il ne peut pas attraper les exceptions à partir d'autres threads. Vous pouvez essayer ce pour dépanner le problème: Dans Visual Studio, dans le menu Déboguer, cliquez sur Exceptions. Puis cochez la case "Common Language Runtime Exceptions". Cela rendra le débogueur arrêter quand une exception est levée. Mais notez que cela peut être assez ennuyeux, parfois, car même si une exception est déjà pris. Vous pouvez utiliser les Cases à cocher pour filtrer les exceptions que vous voulez prendre.
Bonne nouvelle dans mon cas, est que la gestion de la message d'erreur juste dans le clietn service de retour d'appel est suffisant si vous n'êtes pas le débogage.
Grâce
OOpps....
Désolé, pas de réponse de mon côté (bien MSFT gars n'a pas touché l'écrire répondre à des rappels de service sont appelés sur le même thread d'INTERFACE utilisateur), la chose est
Plus d'infos:
Je suppose que quelque chose en rapport avec les options de Visual Studio et de l'interception des exceptions.
Plus d'infos, dans ce fil
http://silverlight.net/forums/p/48613/186745.aspx#186745
Tout à fait intéressant.
Avec Silverlight 3 la le débogueur Visual Studio captures de ces exceptions, de sorte que le gestionnaire d'exception - point de prêter à confusion n'est jamais atteint. Cependant, lors de l'exécution de sans le débogueur, le gestionnaire d'exception est appelé comme prévu. Je suppose que c'est ok aussi longtemps que l'on est conscient de cela. J'avoue que j'ai perdu quelques heures à essayer de comprendre comment percer les rouages de Silverlight/Wcf/Navigateur pour me rendre à mon exception. Ne pas y aller.
Je ne suis pas un plombier, j'ai donc décidé de créer mon propre service WCF classe qui remplace une partie de la fonctionnalité de la classe fichier de référence.cs" qui est automatiquement généré par Visual Studio, j'ai ensuite ajouté mes propres blocs try/catch pour rattraper les erreurs de communication.
La classe que j'ai créée ressemble à quelque chose comme ceci:
En utilisant une mesure de la WCF générateur de Proxy est une bonne solution pour gérer les exceptions asynchrones à l'Argent de la lumière.Cliquez sur ici télécharger le code source.
Avec XNA sur WP7, j'ai constaté que je n'avais pas le choix mais pour ajouter manuellement des try/catch pour les différents async Fin*FunctionName*() méthodes; rien d'autre, j'ai essayé permettrait d'éviter l'échec de l'application & à l'arrêt quand le serveur est indisponible. C'est un vrai glisser manuellement les mise à jour de ce code lorsqu'un service de change.
Je suis surpris de découvrir que ce n'est pas un gros problème car il ne semble pas y avoir d'autre moyen d'attraper ces exceptions sur WP7 à l'aide de XNA, mais je suppose que c'est seulement dit plus sur la façon dont beaucoup (==pas beaucoup) de gens essaient de faire ce que d'autre chose. Si ils serait tout simplement faire slsvcutil.exe générer des modes de synchronisation, on pourrait facilement attraper au sein de notre propre thread de travail, mais malheureusement, le code généré utilise le pool de threads ayant pas les moyens d'intercepter les exceptions.
Pour Gérer cette situation utiliser le TargetInvocationException. Cette capture de l'Exception en cas de panne réseau ou de votre service n'est pas disponible.