Question

J'écris un service WCF pour la première fois. Le service et tous ses clients (du moins pour le moment) sont écrits en C #. Le service doit effectuer beaucoup de validation d'entrée sur les données qui lui ont été transmises. Il me faut donc un moyen d'indiquer des données non valides au client. J'ai beaucoup lu sur les fautes et les exceptions, les exceptions enveloppantes, et beaucoup d'articles contradictoires qui ne font que me troubler. Quelle est la bonne façon de traiter ce cas?

Dois-je éviter les exceptions et créer un message de retour des résultats? Devrais-je créer un défaut spécial, ou une exception spéciale, ou simplement lancer ArgumentExceptions comme je le ferais pour une fonction de validation non-WCF?

Le code que j'ai actuellement (influencé par MSDN ) est :

[DataContract]
public class ValidationFault
{
    [DataMember]
    public Dictionary<string, string> Errors { get; private set; }

    [DataMember]
    public bool Fatal { get; private set; }

    [DataMember]
    public Guid SeriesIdentifier { get; private set; }

    public ValidationFault(Guid id, string argument, string error, bool fatal)
    {
        SeriesIdentifier = id;
        Errors = new Dictionary<string, string> {{argument, error}};
        Fatal = fatal;
    }

    public void AddError(string argument, string error, bool fatal)
    {
        Errors.Add(argument, error);
        Fatal |= fatal;
    }
}

Et sur la méthode, il y a [FaultContract (typeof (ValidationFault))]. Alors est-ce le "droit" façon d'aborder cela?

Était-ce utile?

La solution

Si vous effectuez une validation sur le client et que vous devez avoir des valeurs valides une fois qu'elles ont été transmises à la méthode (appel du service Web), je déclencherais une exception. Il peut s'agir d'une exception indiquant qu'un paramètre n'est pas valide avec le nom du paramètre. (voir: ArgumentException)

Cependant, vous ne voudrez peut-être pas compter sur le client pour valider correctement les données, ce qui vous laisse supposer que des données risquent d’être invalides en entrant dans le service Web. Dans ce cas, ce n'est pas vraiment un cas exceptionnel et ne devrait pas être une exception. Dans ce cas, vous pouvez renvoyer une énumération ou un objet de résultat avec une propriété Status définie sur une énumération (OK, non valide, incomplet) et une propriété Message définie avec des détails, comme le nom du paramètre.

Je veillerais à ce que ce type d’erreurs soit détecté et corrigé au cours du développement. Votre processus d'assurance qualité doit soigneusement tester les utilisations valides et non valides du client et vous ne souhaitez pas renvoyer ces messages techniques au client. Au lieu de cela, vous souhaitez mettre à jour votre système de validation pour éviter que des données non valides ne parviennent à l'appel de service.

Mon hypothèse pour tout service WCF est qu’il y aura plus d’une interface utilisateur. L’une d’elles pourrait être une interface Web à présent, mais plus tard, je pourrai en ajouter une autre avec WinForms, WinCE ou même une application mobile native pour iPhone / Android qui ne correspond pas à ce que vous attendez de clients .NET.

Autres conseils

Le lancement d'une exception n'est pas utile depuis un service WCF Pourquoi pas? Parce que cela revient comme une simple faute et que vous devez

a) Définissez l'erreur pour inclure les exceptions

b) Analyser la faute pour obtenir le texte de l'exception et voir ce qui s'est passé.

Alors oui, vous avez besoin d’une faute plutôt que d’une exception. Dans votre cas, je créerais une faute personnalisée contenant une liste des champs pour lesquels la validation a échoué dans le cadre du contrat de faute.

Notez que WCF utilise des dictionnaires amusants, qui ne sont pas ISerializable; il a une manipulation spéciale, alors vérifiez que le message qui revient ressemble bien sur le fil; sinon c'est le retour aux tableaux pour vous.

vous souhaiterez peut-être jeter un coup d'œil au bloc de validation de bibliothèque de modèles et de pratiques de l'entreprise MS en association avec le bloc d'injection de stratégie link text , il vous permet de décorer vos membres de contrat de données avec des attributs de validation et de décorer l'implémentation du service. Cela, associé à son intégration à WCF, signifie que les échecs de validation sont renvoyés sous forme d'erreurs ArgumentValidationException contenant chacune un objet ValidationDetail. pour chaque échec de validation.

En utilisant l'entlib avec WCf, vous pouvez obtenir beaucoup de validation et de rapport d'erreur sans avoir à écrire beaucoup de code

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top