Doit des services web lancer des exceptions OU des objets de résultat
Je ne suis pas sûr que je suis complètement heureux de lancer des exceptions dans les services web est une bonne idée. Je ne m'occuperais pas autant si ce n'était pas la trace de la pile. Ce n'est pas quelque chose que je wan pas.
J'ai fait des recherches autour de plusieurs implémentations et il n'y a vraiment ne semble pas être un consensus sur ce point. CampaignMonitor par exemple renvoyer un objet de Résultat, d'autres encore n'en ont pas.
L'architecture, je ne suis pas sûr de retourner un objet de retour de sens, sûrement une exception une exception, mais ce que j'aime à propos d'un objet de Retour, c'est que c'est une solution élégante pour l'utilisateur final.
Quelqu'un at-il de meilleures solutions?
MODIFIER
BTW, je suis en utilisant des services web ASMX, où se tournant CustomErrors n'est pas une option.
Oui c'est ce que je dis ici. Malheureusement, ce n'est pas une option pour moi. Sinon, ce serait un problème bien plus simple pour moi :(.
OriginalL'auteur Ryan Tomlinson | 2009-06-19
Vous devez vous connecter pour publier un commentaire.
Quelle trace de la pile parlez-vous? Avez-vous essayé?
Dans les deux ASMX et des services WCF, une exception non interceptée sera traduit en une erreur SOAP. Dans les deux cas, ils peuvent être configurés pour ne pas l'inclure toute trace de la pile. En fait, c'est la valeur par défaut dans WCF.
Donc, la bonne façon de retourner une erreur de ce genre est par le biais d'une faute. Une façon de générer des défauts est de lancer et de ne pas traiter une exception.
Lire sur les erreurs SOAP. C'est la façon standard de retour arbitraire de détails pour un client. Dans les services web ASMX, vous devez les retourner "à la main" dans le Détail de biens d'une SoapException exemple, mais c'est la bonne façon, si vous devez rester avec ASMX. Bien sûr, la meilleure façon est d'utiliser WCF. Aussi, ne pensez pas que l'information des utilisateurs sur les exceptions. Les Exceptions sont un détail d'implémentation. Vous êtes les informer à propos d'une faute.
Ce n'est pas ce que j'observe. Mes services web ASMX renvoyer toutes les traces de pile dans paramètres par défaut, et il me pousse à la folie. Et quand il y a une chaîne de services d'appeler les uns les autres, et le dernier dans la chaîne de jette, le client reçoit une énorme trace de la pile de tous les services participants (sous la forme d'un
SoapException
laMessage
de la propriété qui contient la trace de la pile comme concaténées texte). C'est horrible, et je n'ai aucune idée de comment le désactiver.vous éteindre dans l'une des deux façons suivantes: 1. Commutateur pour WCF, où vous pouvez contrôler si les détails sont dans le message, et 2. Corriger votre code pour ne pas être brisé.
Je ne suis pas de commutation de la WCF pour des raisons de compatibilité, et le code n'est pas cassé, j'ai volontairement jeter l'exception lors de la détection de mauvais paramètres, fournir une aide
Message
. Je sais que je peux revenir à un mannequin de réponse de l'objet avecSuccess = false
, mais c'est stupide, comme vous l'avez dit dans votre réponse, la façon correcte est de lever des exceptions. Je ne peux toujours pas croire qu'il est impossible d'éteindre la trace de la pile - dans ce cas, tous les clients de tous les exposés publiquement ASMX services peut jetter un oeil dans le code source de la structure de chaque si souvent?OriginalL'auteur John Saunders
Ne laissez pas le fait que vous êtes dans un service web confondre la question. C'est juste un détail d'implémentation.
Utilisation normale de votre stratégie de gestion des exceptions. Les meilleures pratiques dit de ne pas coincer les exceptions dans le code bas-niveau, à moins que vous pouvez résoudre cette exception là et continuer normalement. Les Exceptions doivent être soulevées pour la couche de présentation afin que l'utilisateur peut être informé de l'erreur.
Donc, appliquées à des services web-en général, lancer des exceptions (qui se traduit par un type soapfault). Cela permet à l'invocation du code client, il est intégré dans la gestion des exceptions standard pour le manipuler.
OriginalL'auteur Maladon
une approche est de séparer le système et les entreprises des erreurs. (Erreur système: par exemple, demande mal formulée, l'utilisateur non-autorisé, etc.; erreur d'affaires: par exemple, la méthode UpdateCars entraîne une erreur, l'utilisateur ne possède pas toutes les voitures).
Dans le cas d'une erreur d'affaires, retourne un objet response contenant une description de l'erreur; dans le cas d'une erreur du système, de lever une exception.
OriginalL'auteur azheglov
Pouvez-vous préciser un peu? Le côté serveur d'un service web peut lever une exception. Le côté serveur d'un service web peut renvoyer un message pour le côté client. Ce message peut contenir des informations sur l'erreur, et que les informations d'erreur peuvent notamment inclure des détails d'exception. Ou il ne peut pas. Sur le côté client, vous avez généralement un proxy généré pour traiter les messages du serveur. Cette procuration peut générer une exception si la réponse contient des informations sur l'erreur.
Partie de ce scénario, vous vous demandez?
Je comprends comment les services web de travail, je veux dire plus d'une conception de l'architecture. Il y a des cas où je n'ai besoin de lever des exceptions. Dans ces cas, les informations de trace de pile est sérialisé pour le client. Je ne pense pas que ce soit une bonne idée. Quelle est la meilleure façon de cacher le détail? Ou est la réponse à retourner à un "Retour" de l'objet (l'exemple que j'ai donné c'était CampaignMonitors exemple d'api).
travailler à travers toutes les combinaisons de la customeError balise web.config. Je crois que l'un d'entre eux tourne les traces de pile off.
Voir le commentaire sur la question d'origine. Malheureusement pas une option pour moi.
OriginalL'auteur Bruce
Je suppose que de lever des exceptions est en général une meilleure conception de modèle, puis de retourner un résultat.
Je suppose que vous avez à faire est de l'intérieur de votre web services pour masquer la trace de la pile en appliquant le modèle suivant pour chaque méthode exposée en tant que service web:
ou vous pouvez également
Si vous re-lancer une exception, vous permet de masquer la trace de la pile d'origine des clients de vos services web.
par ApplicationException je voulais dire tout personnalisé d'exception. Ok, permet de dire qu'il devrait être MyWebServiceException ou quelque chose comme ça. Aussi, en fait, il n'est pas obsolète, et des exceptions comme le Système.Le filetage.WaitHandleCannotBeOpenedException toujours hériter de cette. MS ne dit qu'ils ne pense pas que c'est très précieux, mais encore ce que vous utilisez comme classe de base pour vos exceptions est naturellement votre propre choix, qui est aussi parfois dictée par les conventions de codage, vous devriez obéir dans le projet actuel.
OriginalL'auteur Bogdan_Ch
Je ne vois pas pourquoi vous ne pouvez pas faire les deux? Intercepter l'exception, journal (soit à une base de données ou dans un fichier), puis de retourner un code d'erreur. De cette façon, vous avez un gracieux exécution du webservice appel, et également la notification de l'erreur, et vous avez une place ailleurs vous pouvez déboguer.
@Jean a dit, et je suis d'accord, des exceptions sont là pour informer d'une faute. Des Exceptions seront sérialisés dans une erreur SOAP. Comme un résultat de retourner un code d'erreur ne rentre pas dans le protocole très bien. Voir ci-dessous: msdn.microsoft.com/en-us/library/ds492xtk(SV.85).aspx
OriginalL'auteur James Hall