2009-04-14 11 views
2

Ich habe eine Web-Service-Methode, wo ich einige benutzerdefinierte Ausnahmen, z. SomeException, SomeOtherException usw., die der Webdienst dann in einen SOAP-Fehler verwandeln würde, den der Client verarbeiten könnte. In Java kann ich wsdl: Fehlerelemente innerhalb des wsdl: operation-Elements in der WSDL haben. Es scheint, dass es .NET ist, dass dies nicht berücksichtigt ist und dass es keine Möglichkeit gibt, Attribute auf eine WebMethode zu setzen, um zu zeigen, welche SOAP-Fehler auftreten können..NET 2.0 Web Services WSDL Fehlerelement wird ignoriert?

Wenn ich einen Java-Webdienst mit wsdl: fault -Elementen erstelle und einen Webverweis zu einem .NET-Projekt hinzufüge, hätte ich erwartet, dass die wsdl: fault -Elemente entsprechend benannte Ausnahmen genauso erstellen, wie die anderen Entitäten erstellt, scheint dies jedoch nicht der Fall zu sein.

Ist es der Fall, dass WSDL: Fehler Elemente in einer WSDL vollständig von .NET ignoriert werden? Sie sind Teil der WSDL-Spezifikation, die unter http://www.w3.org/TR/wsdl definiert ist, also war dies nicht das Verhalten, das ich erwartet hatte.

Wenn dies der Fall ist, können Workarounds ein Ergebnisobjekt zurückgeben, das einen booleschen Erfolg/Fehler-Wert und eine Fehlermeldung/enum enthält. Oder mithilfe von SoapExceptions. Wenn ich mich dazu entscheide, SoapExceptions zu verwenden, setze ich die Emphese auf den Benutzer meines Web-Services, um diese zu behandeln und zu deserialisieren. Beides scheint keine gute Methode zu sein, dies zu beheben und zusätzliche Probleme und Code hinzuzufügen, um dies zu umgehen.

Irgendwelche Ratschläge?

+0

Welche Art von Client verwenden Sie? Wenn es Silverlight in einem Browser ist, dann gibt es Mängel bei der Behandlung von SOAP-Fehlern. – sipwiz

+0

Der Client ist eine ASP.NET-Website. – Martin

Antwort

3

Da Sie nach .net 2.0 fragen, wissen Sie, dass dies in WCF "behoben" ist, wo Sie das Attribut [FaultContract (typeof (YourCustomException))] hinzufügen können.

Der "normale" Weg, wie dies in 2.0 gemacht wurde, ist, wie Sie sagen, eine Antwortnachricht mit einer success-boolean, Result und a Error Eigenschaft hinzuzufügen.

Sie können normalerweise sehen, wie dies in EntLib getan wird.

+0

Yeah Ich bin mit .NET 2 fest, ich wusste darüber in WCF und hoffte, es gab eine Möglichkeit, [FaultContract (typeof (YourCustomException)] in einem SOAP-Webdienst in .NET 2 zu implementieren, die ich übersehen, aber aussieht So ist das nicht der Fall. – Martin

+0

Sieht so aus, als ob der beste Weg, dies zu handhaben, darin besteht, dem Muster der "success-boolean, Result und a Error" -Eigenschaft zu folgen. Vielen Dank. – Martin

2

ASMX-Webdienste unterstützten das Element wsdl: fault weder auf dem Client noch auf dem Server. Sie werden es nie tun.

Wie ThorHalvor gesagt hat, wird der Bugfix dafür "WCF" genannt.

Ich habe erfolgreich eine WSDL geschrieben, die wsdl: fault-Elemente enthält, und diese Fehler dann über einen ASMX-Webdienst zurückgegeben, indem die Fehlermeldung als Detaileigenschaft einer SoapException eingefügt wurde. Java- und WCF-Clients haben dies dann ordnungsgemäß als eine Ausnahme der entsprechenden Art angesehen.

+0

Ich habe die WSDL von Hand geschrieben, damit andere Clients, die mit wsdl: fault arbeiten, diese aufheben können. Aber es lässt Leute, die mit .NET arbeiten, ohne überhaupt auszuarbeiten, was in Bezug auf Ausnahmen passiert, es sei denn, sie lesen die WDSL selbst durch. – Martin

+0

Nützlich zu wissen, dass ASMX-Webdienste das Fehlerelement in der WSDL nicht unterstützen. Mir war klar, dass dies kein Problem sein würde, wenn ich WCF benutze, aber ich kann das momentan nicht tun, also habe ich auf eine Lösung in .NET 2 gehofft wie im Titel. – Martin

+0

Nein, wenn Ihr Dienst einen ordnungsgemäßen Fehler sendet, indem die Detail-Eigenschaft der SoapException ausgefüllt wird, erhält sogar ein .NET 2.0-Client eine SoapException mit der Detail-Eigenschaft. Nur keine separate Ausnahme für jeden Fehler. –

2
[return: System.Xml.Serialization.XmlElementAttribute("ResultWS", typeof(ResultWS), Namespace = "http://...")] 
[return: System.Xml.Serialization.XmlElementAttribute("ResultFaultWS", typeof(ResultFaultWS), Namespace = "http://...")] 
public object SumTest_Operation([System.Xml.Serialization.XmlElementAttribute(Namespace = "http://...")] ParamWS param) 
{    
    ResultWS result = null; 
    try 
    { 
     result.Value = param.P1 + param.P2;    

    } 
    catch (Exception) 
    { 
     ResultFaultWS resultFault = new ResultFaultWS(); 
     resultFault.Status = noOK; 

     return resultFault;; 
    } 
    return result; 
}