37 votes

WCF - Défauts / Exceptions versus Messages

Nous sommes actuellement à avoir un débat de savoir si c'est mieux de jeter les défauts sur une WCF canal, contre le passage d'un message indiquant l'état ou de la réponse à partir d'un service.

Les fautes viennent avec construit dans le soutien de la WCF où par vous pouvez utiliser les gestionnaires d'erreur et de réagir en conséquence. Ceci, cependant, porte de frais généraux que de lancer des exceptions dans .NET peut être très coûteux.

Les Messages peuvent contenir les informations nécessaires pour déterminer ce qui s'est passé avec votre service d'appel sans les frais de lancer une exception. Il n'a cependant besoin de plusieurs lignes de code répétitif pour analyser le message et de déterminer les actions à la suite de son contenu.

Nous avons pris un coup de couteau à la création d'un message générique de l'objet que nous pourrions utiliser nos services, et c'est ce que nous sommes arrivés avec:

public class ReturnItemDTO<T>
{
    [DataMember]
    public bool Success { get; set; }

    [DataMember]
    public string ErrorMessage { get; set; }

    [DataMember]
    public T Item { get; set; }
}

Si tous mes appels de service de retour de ce point, je peux vérifier de manière systématique le "Succès" de la propriété afin de déterminer si tout s'est bien passé. J'ai ensuite une chaîne de message d'erreur en cas indiquer que quelque chose s'est mal passé, et un élément générique contenant un Dto si nécessaire.

L'exception de l'information devra être connecté à une centrale du service de journalisation et de ne pas transmises à partir du service.

Pensées? Des commentaires? Des idées? Des Suggestions?

Quelques précisions supplémentaires sur ma question

Une question que je vais avoir avec la faute des contrats est de communiquer les règles d'affaires.

Comme, si quelqu'un se connecte, et leur compte est bloqué, comment dois-je communiquer que? Leur login évidemment échoue, mais il échoue en raison de la raison "Compte bloqué".

Donc j':

A) utiliser un booléen, jeter la Faute avec le message compte verrouillé

B) retour AuthenticatedDTO de l'information pertinente

32voto

pb. Points 4609

Toutefois, cette porte de frais généraux que de lancer des exceptions dans .NET peut être très coûteux.

Vous êtes à la sérialisation et de la sérialisation des objets au format XML et de les envoyer sur un réseau lent.. la surcharge de lancer une exception est négligeable par rapport à ça.

J'ai l'habitude de tenir à lever des exceptions, car elles communiquent clairement quelque chose s'est mal passé et tous les webservice outils ont une bonne façon de les manipuler.

Dans votre exemple, je voudrais jeter un UnauthorizedAccessException avec le message "Compte bloqué".

Précisions: Les .NET des services wcf traduire des exceptions à FaultContracts par défaut, mais vous pouvez changer ce comportement. MSDN:la définition et la gestion des erreurs dans les Contrats et les Services

6voto

Despertar Points 5365

Si vous pensez à appeler le service à appeler une autre méthode, elle peut aider à mettre les choses en perspective. Imaginez si chaque méthode que vous avez appelé renvoyé un état, et vous, c'est à vous de vérifier si c'était vrai ou faux. Il serait assez fastidieux.

result = CallMethod();
if (!result.Success) handleError();

result = CallAnotherMethod();
if (!result.Success) handleError();

result = NotAgain();
if (!result.Success) handleError();

C'est l'un des points forts d'une structure de gestion des erreurs système, c'est que vous pouvez séparer votre logique réelle de votre erreur de manipulation. Vous n'avez pas à garder le contrôle, vous savez qu'il a été un succès si aucune exception n'est levée.

try 
{
    CallMethod();
    CallAnotherMethod();
    NotAgain();
}
catch (Exception e)
{
    handleError();
}

En même temps, en renvoyant un résultat que l'on met plus de responsabilité sur le client. Vous le savez peut-être de vérifier les erreurs dans le résultat de l'objet, mais John Doe arrive et commence à l'appel de loin à votre service, oubliant que quelque chose est incorrect parce qu'une exception n'est levée. C'est une autre grande force des exceptions, c'est qu'ils nous donnent une bonne claque dans le visage quand quelque chose est mauvais et doit être prise en charge.

1voto

WebDude Points 3326

Le problème que je rencontre avec Fault Contracts est la communication des règles commerciales.

Par exemple, si quelqu'un se connecte et que son compte est verrouillé, comment puis-je le communiquer? Leur connexion échoue évidemment, mais elle échoue pour la raison "Compte verrouillé".

Moi aussi:

A) utiliser un booléen, jeter Fault avec le compte de message verrouillé B) renvoyer AuthenticatedDTO avec les informations pertinentes

0voto

ZombieSheep Points 18967

J'envisagerais sérieusement d'utiliser les objets FaultContract et FaultException pour résoudre ce problème. Cela vous permettra de renvoyer des messages d'erreur significatifs au client, mais uniquement lorsqu'une condition d'erreur se produit.

Malheureusement, je suis actuellement en cours de formation, je ne peux donc pas écrire une réponse complète, mais la chance me le permet, j'apprends la gestion des exceptions dans les applications WCF. Je posterai ce soir avec plus d'informations. (Désolé c'est une réponse faible)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X