2009-05-03 10 views
0

Hallo und vielen Dank für Ihre Meinung.wcf Architekturdesign. Re: Rückgabewerte

Ich erstelle einen Webservice. Dieser Webservice akzeptiert einen Kunden und die Kundenkonten zusammen mit ein paar anderen verwandten Objekten und Attributen und dergleichen.

Wenn der Webservice eine Anfrage erhält, versuche ich sie zu verarbeiten.
Wenn es keinen Fehler gibt, ich einfach einfach zurückkehren. Wenn es einen Fehler gibt, werfe ich es.

Ich frage mich, ob dies der beste Ansatz ist, oder ob ich mein Design ändern sollte, so dass ich ein Bool als Antwort zurückgeben oder sogar ein Antwortobjekt erstellen, das möglicherweise das ursprüngliche Anforderungsobjekt plus einen Status und enthält wenn Fehler, eine Liste von Fehlern (zB: Fehlende Felder, ungültige Felder, ext).

Welche Rückführungsmethode würden Sie in Ihr Design integrieren?
1) Nur zurück, wenn kein Fehler, Throw-Fehler, wenn Fehler 2) bool Erfolg 3) Response-Objekt (mit ursprünglichen Anfrageobjekt? Und detaillierte Ergebnisse)?

Vielen Dank für Anregungen. Steven

Antwort

0

Ich würde sagen, es hängt davon ab, was der ‚Fehler‘ ist. Wenn der Fehler validierungsbezogen ist, jedoch im normalen Ablauf von Ereignissen erwartet wird, z. B. ungültige Benutzeranmeldeinformationen an einen Dienst übergeben werden, der Benutzerauthentifizierung bereitstellt, ist wahrscheinlich ein Enum-Wert, der das Anforderungsergebnis angibt (Erfolg, Fehler usw.), OK. Wenn der Fehler jedoch auf eine Eingabe zurückzuführen ist, die im normalen Ablauf der Ereignisse nicht auftreten sollte, würde ich vorschlagen, dass Sie einen Fehler von der Dienstoperation auslösen. Wenn ein Fehler ausgegeben wird, weist dies darauf hin, dass die Client-App fehlerhaft ist und Informationen bereitgestellt hat, mit denen der Dienst nicht umgehen kann. Sie können bestimmte Fehlerverträge mit einem WCF-Dienstvorgang registrieren, sodass eine Client-Anwendung weiß, dass der Vorgang unter bestimmten Umständen einen Fehler auslösen kann. Die Clientanwendung sollte Ausnahmehandler für diese Fehler bereitstellen und Maßnahmen ergreifen, wenn eine ausgelöst wird, andernfalls wird sie unerwartet beendet.

Als eine grundlegende Faustregel würde ich sagen, dass Fehler unter außergewöhnlichen Umständen, z. wo der Client Eingaben bereitgestellt hat, die die Serviceoperation nicht erwartet. Wenn der Client Informationen zur Verfügung gestellt hat, die falsch sind, aber die Serviceoperation für die Verarbeitung programmiert ist, geben Sie einen Statuscode oder Informationen in der Antwortnachricht zurück.

+0

Hallo Pmarflee. Danke für Ihre Antwort. Meine appologes, ich vergaß zu erwähnen, dass dieser Webservice nicht intern ist, aber für einen Client, wer kann nicht verwenden wcf. Wäre es auf Basis dieser Informationen möglich, mit dem oben beschriebenen Modell fortzufahren? – stevenrosscampbell

+0

Verwenden Sie SOAP als Protokoll zum Übertragen von Nachrichten? Wenn dies der Fall ist, definiert das SOAP-Format ein Fault-Element, das zum Speichern von Fehlern und Statusinformationen für eine SOAP-Nachricht verwendet werden kann. SOAP ist XML-basiert, sodass Ihr Client die im Fehler enthaltenen Fehlerinformationen unabhängig von der verwendeten Plattform lesen kann. WCF-Ausnahmeabschirmung bedeutet, dass Fehlerinformationen nur in Bezug auf Fehler, die für die Bereitstellung der Serviceoperation konfiguriert wurden, an den Client weitergegeben werden. Alle anderen Fehler werden unterdrückt und eine generische Fehlermeldung wird an den Client zurückgegeben. – pmarflee

0

ich denke, dass es hängt davon ab, die diesen Service nutzen,

wenn Sie sind der einzige, der diesen Service nutzen empfehle ich Ihnen nichts zurückzukehren (oder die ursprüngliche Anforderung) und Ausnahmen zu werfen, wenn etwas ist falsch.

Wenn der Dienst öffentlich genutzt wird, sollten Sie ein Antwortobjekt zurückgeben, das Fehler und einige andere relevante Daten enthält.

Glück

+0

Hallo Chen Kinnrot. Danke für Ihre Antwort. Ich habe vergessen zu erwähnen, dass dies keine interne App ist, und dass es von externen Kunden verwendet wird, die nicht den WCF benutzen. Würden Sie einen Vorteil sehen, wenn das Antwortobjekt auch die ursprüngliche Anfrage enthält, oder wäre das ein Overkill? – stevenrosscampbell

+0

Ich denke, dass Sie die Anfrage nicht zurückgeben müssen, es sei denn Sie müssen. Wenn Sie nur eine einfache Zeichenfolge oder Nummer zurückgeben können, die ein Schlüssel für den Ergebnistyp ist (Sie werden die Ergebnisbedeutung auf einer Site veröffentlichen), wird es am besten sein, da Sie jede Technologie mit Ihrem Service arbeiten lassen. –

1

Als allgemeine Faustregel gilt: Wenn die Umstände es nicht zulassen, dass Sie die Anfrage erfolgreich abschließen, werfen Sie eine Ausnahme aus. Wenn Sie andere Informationen wie Auftragsnummer usw. zurückgeben möchten, verwenden Sie einen Rückgabewert. Es ist im Allgemeinen keine gute Idee, einen vollständigen Fehler über einen booleschen Rückgabewert zu signalisieren, der vom Aufrufer ignoriert/nicht überprüft werden kann.

Jetzt, da es sich um einen WCF-Dienst handelt, der von externen Quellen verwendet wird, sollten Sie nicht einfach eine Ausnahme - das ist eine .NET-spezifische Sache - auslösen, sondern einen SOAP-Fehler auslösen.Sie sollten diese Fehler als Teil des Servicevertrages auf jedem Betrieb Ihrer Serviceangebote, durch Hinzufügen eines oder mehrere FaultContract Attribut für Ihren Betrieb erklären:

[FaultContract(typeof(MyFault1))] 
[FaultContract(typeof(MyFault2))] 
[OperationContract] 
void MyOperation() 

Sie können dies in .NET WCF tun einfach durch ein FaultException werfen oder eine spezifischere FaultException (eine generische Variante, in der Sie den exakt-Fehlertyp angeben können).

Marc