Frage

Ich bin ein WCF-Dienst zum ersten Mal zu schreiben. Der Service und alle seiner Kunden (zumindest vorerst) in C # geschrieben. Der Service hat viele Eingabevalidierung auf den Daten zu tun es übergeben wird, so brauche ich eine Möglichkeit haben, um ungültige Daten zurück an den Client anzuzeigen. Ich habe eine Menge über Fehler und Ausnahmen gelesen, Verpackung Ausnahmen in Fehlern und vielen widersprüchlichen Artikel, die weiter verwirren mich. Was ist der richtige Weg, um diesen Fall zu behandeln?

Soll ich Ausnahmen ganz vermeiden und verpacken eine Ergebnismeldung zurück? Soll ich einen speziellen Fehler erstellen oder eine besondere Ausnahme, oder einfach nur werfen ArgumentExceptions, wie ich sich für eine Nicht-WCF-Validierungsfunktion?

Der Code, den ich jetzt (beeinflusst von MSDN ) haben, ist :

[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;
    }
}

Und auf der Methode gibt es [FaultContract (typeof (ValidationFault))]. Das ist also der „richtige“ Weg, dies zu nähern?

War es hilfreich?

Lösung

Wenn Sie die Validierung auf dem Client tun und sollen gültige Werte haben, sobald sie in die Methode übergeben werden (der Web-Service-Aufruf), dann würde ich eine Ausnahme werfen. Es könnte eine Ausnahme sein, das anzeigt, dass ein Parameter mit dem Namen des Parameters ist ungültig. (Siehe: Argument)

Sie können aber wollen nicht auf dem Client angewiesen, die Daten ordnungsgemäß zu validieren und lässt Sie mit der Annahme, dass die Daten kommen in den Web-Dienst ungültig sein könnte. In diesem Fall ist es nicht wirklich ein Ausnahmefall und soll keine Ausnahme sein. In diesem Fall könnten Sie eine ENUM oder ein Ergebnisobjekt zurück, die eine Status-Eigenschaft auf eine Enumeration (OK, Invalid, Unvollständig) und eine Message-Eigenschaft mit Besonderheiten, wie der Name des Parameters gesetzt hat.

Ich würde dafür sorgen, dass diese Art von Fehlern gefunden und während der Entwicklung festgelegt. Ihr QA-Prozess sollte sorgfältig prüfen, gültige und ungültige Verwendungen des Client und Sie nicht möchten, dass diese technische Meldungen zurück an den Client weiterzuleiten. Was Sie stattdessen tun will, ist Ihr Validierungssystem aktualisiert ungültige Daten zu verhindern, dass an den Service-Aufruf zu bekommen.

Meine Vermutung für jeden WCF-Dienst ist, dass es mehr als eine UI sein. Man könnte einen Web-UI jetzt, aber später kann ich noch mit WinForms, WinCE hinzufügen oder sogar eine native iPhone / Android mobile Anwendung, die nicht übereinstimmt, was Sie von .NET-Clients erwartet.

Andere Tipps

eine Ausnahme zu werfen ist nicht sinnvoll, von einem WCF-Dienst Warum nicht? Weil es wieder als bloße Störung kommt, und Sie müssen

a) Stellen Sie die Fehler Ausnahmen enthalten

b) Analysieren Sie die Fehler den Text der Ausnahme zu bekommen und sehen, was passiert ist.

Also ja benötigen Sie einen Fehler, anstatt eine Ausnahme. Ich würde in Ihrem Fall, erstellen Sie einen benutzerdefinierten Fehler, der eine Liste der Felder enthält, die die Validierung als Teil des Fehler Vertrages fehlgeschlagen.

Beachten Sie, dass WCF macht Spaß Dinge mit Wörterbüchern, die nicht ISerializable; es hat eine besondere Behandlung, überprüfen, so dass die Nachricht zurück kommt der Draht sieht gut über; wenn nicht, es ist zurück auf Arrays für Sie.

Sie können einen Blick auf die MS Patterns and Practices Enterprise Library Validation-Block in Verbindung mit der Politik Injektionsblock link text ermöglicht es Ihnen, Ihren Datenvertrag Mitglieder mit Validierungs Attributen dekorieren und auch die Service-Implementierung dekorieren, diese zusammen mit WCF mit seiner Integration bedeutet dies, dass die jeweils ein automatisch ValidationDetail Objekt als ArgumentValidationException Fehler bei der Validierung Ausfälle zurückgegeben werden für jeden Prüfungsfehler.

Mit dem EntLib mit WCf Sie viel Validierung erhalten können, die Fehlerberichterstattung, ohne viel Code schreiben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top