2009-07-20 5 views
6

Meine Web-Service-Methode gibt ein Sammlungsobjekt zurück, das serialisiert wird, dank der Funktionsweise der C# -Webservices!Wie gibt man Fehler von einem ASMX Web Service zurück?

Aber wenn mein Code eine nicht abgefangene Ausnahme auslöst, möchte ich stattdessen ein benutzerdefiniertes Fehlerobjekt zurückgeben.

Ist dies mit C# ASP.NET v2 möglich?

Zum Beispiel

Normalbetrieb zurückkehren sollte:

<Books> 
    <book>Sample</book> 
    <book>Sample</book> 
</Books> 

Aber auf Fehler Ich möchte

<error> 
     <errorMessage></errorMessage> 
    </error> 
+0

Beachten Sie, dass ASMX-Webdienste SOAP-Fehler nicht ordnungsgemäß unterstützen. Die generierte WSDL definiert die Fehler nicht, sodass einige Clients sie ignorieren oder beim Empfang schwerwiegende Fehler zurückgeben. Verwenden Sie stattdessen WCF, um dieses Problem zu vermeiden. –

Antwort

7

Ja, das ist möglich.

Was Sie suchen müssen, ist die SoapException class, und speziell die Detail property der SoapException-Klasse.

Die SoapException-Klasse wird effektiv einen "Soap Fault" rendern, der den standardkonformen Mechanismus für die Rückgabe von Fehlerinformationen an Clients/Verbraucher von einer Webdienstmethode darstellt.

Die Eigenschaft "Detail" der SoapException-Klasse hat den Typ XmlNode und kann daher entweder einen einzelnen Knoten/ein einzelnes Element oder eine Hierarchie von untergeordneten Knoten enthalten. Der Detail-Knoten könnte daher leicht das "Elternteil" für die serialisierte Darstellung Ihres eigenen benutzerdefinierten Fehlerobjekts enthalten und als solches fungieren.

Von MSDN:

Die ausführliche Eigenschaft für die Versorgung anwendungsspezifische Fehlerdetails zu dem Körperelement der SOAP-Anforderung im Zusammenhang gedacht. Wenn gemäß der SOAP-Spezifikation ein Fehler auftritt, weil die Clientanforderung aufgrund des Body-Elements der SOAP-Anforderung nicht verarbeitet werden konnte, muss die Detaileigenschaft festgelegt werden. Wenn in den Headereinträgen der SOAP-Anforderung ein Fehler aufgetreten ist, müssen Sie eine SoapHeaderException auslösen, sodass die Fehlerdetails im SOAP-Header zurückgegeben werden. Wenn der Fehler aufgrund der Verarbeitung des Body-Elements nicht aufgetreten ist, darf die Detail-Eigenschaft nicht festgelegt werden.

Beim Erstellen eines XmlNode für die Detail-Eigenschaft können die Eigenschaften Name und Namespace von DetailElementName verwendet werden, um Konsistenz mit der SOAP-Spezifikation zu gewährleisten.

Alle unmittelbar untergeordneten Elemente des Detailelements werden als Detaileinträge bezeichnet, und jeder Detaileintrag wird als unabhängiges Element innerhalb des Detailelements codiert. richtig SOAP bleiben konform mit Ihrem Web-Service-Antworten

Beachten Sie, dass, wenn Sie möchten, erhalten Sie eine SoapHeaderException eher als ein Soap zurückkehren müssen wenn der Fehler-Header innerhalb der Client-Abschnitt der ursprünglichen XML-Anforderung auftritt (Dies kann oft der Fall sein, wenn Sie zB custom SOAP headers für Sicherheitsnachweise verwenden, wie oben beschrieben).

+0

Könnten Sie bitte ein Beispiel geben? –

+0

@JL - Der Link SoapException-Klasse in meiner Antwort (erster Link) enthält Beispielcode in VB und C#, um eine "benutzerdefinierte" Fehlermeldung zu werfen. Zugegebenermaßen erstellt es die Detail-Eigenschaft, indem es manuell ein XmlNode-Objekt erstellt und hinzufügt, aber dies könnte durch ein Xml ersetzt werden, das durch das Serialisieren eines eigenen Objekts erstellt wurde, möglicherweise unter Verwendung der System.Xml.Serialization.XmlSerializer-Klasse. Siehe hier: http://support.microsoft.com/kb/815813 – CraigTP

+0

Absolut perfekte Antwort! Danke Craig ... Ich würde jedem empfehlen, ein benutzerdefiniertes Fehlerobjekt zurückzugeben, um eher mit der Standard-SOAP-Ausnahme zu gehen. Seine standardisierte, so leicht zu rechtfertigen, solche Maßnahmen zu ergreifen. –

Verwandte Themen