Frage

Ich wollte eine Einwegmethode für den WCF-Dienst erstellen.Alles ist in Ordnung, es sei denn Ich möchte eine Fehlermeldung zurückgeben - falls vorhanden.

Ich verwende den wscf Blue Code Generator für WSDL- und Vertragsdateien.

Im WSDL-Operationselement habe ich nur untergeordnete Elemente 'Eingabe' und 'Fehler'.Wenn ich den Dienst starte, habe ich die Information erhalten, dass Fehlermeldungen in der Einwegkommunikation nicht deklariert werden können und..eine der Lösungen besteht darin, one-way auf false zu setzen ..was ich gemacht habe und gut funktioniert es ok.Wenn ein Fehler auftritt, erhalte ich die Nachricht.

Ich frage mich jedoch, ob ich gegen die Regeln zur Erstellung von Webdiensten / WSDL verstoßen habe...Weil der WSDL-Dienst-Schema-Generator für mich eine Einweg-Kommunikation erstellt (auf 'true' gesetzt) und andere Generatoren in anderen Programmiersprachen wahrscheinlich dasselbe tun würden...

Ist es also richtig, was ich getan habe?Wie kann ich wsdl ändern, damit der Generator den Code entsprechend erstellen kann?

Wenn ich theoretisch keinen Fehler in der Einwegkommunikation verwenden kann, benötige ich dann eine zusätzliche Struktur für die Antwort, um einen Fehler zurückzugeben?

Danke!

War es hilfreich?

Lösung

Es ist wahr, dass Einwegvorgänge können keine Fehler zurückgeben an Kunden.Wenn Sie eine generieren möchten void keine Einbahnstraße service-Betrieb in WCF müssen Sie fügen Sie ein leeres Ausgabeelement hinzu für diesen Vorgang in Ihrem WSDL-Vertrag.

Die .NET-basierten WSDL-Parser (wie z WSCF.blau und svcutil) generiert Einweg-Servicevorgänge für <wsdl:operation> elemente, die nicht haben Sie eine entsprechende <wsdl:output> Element.

Zum Beispiel diese WSDL-Operation ist ein Weg:

<wsdl:definitions>
    <wsdl:portType>
        ... 
        <wsdl:operation name="Foo">
           <wsdl:input message="tns:FooRequest" />
        </wsdl:operation>
    </wsdl:portType>
</wsdl:definitions>

Andererseits definieren Sie eine Operation mit einem leeren <wsdl:output> element (dh ein XSD-Typ, der eine enthält) leere Sequenz) wird auf eine void keine Einbahnstraße methode in .NET, die optional eine Fehlerdeklaration enthalten kann:

<wsdl:definitions>
    <wsdl:portType>
        ... 
        <wsdl:operation name="Foo">
           <wsdl:input message="tns:FooRequest" />
           <wsdl:output message="tns:FooResponse" />
           <wsdl:fault message="tns:FooFault" />
        </wsdl:operation>
    </wsdl:portType>
</wsdl:definitions>

wo die <tns:FooResponse> typ ist einfach definiert als:

<xs:element name="FooResponse">
    <xs:complexType>
        <xs:sequence/>
    </xs:complexType>
</xs:element>

Andere Tipps

In der WCF-Ein-, Einwegeinrichtung hat keine zurückgegebenen Werte und der Kunde kümmert sich nicht um den Erfolg oder Misserfolg des Aufrufs.

In der WCF haben wir auch einige andere Operationen, die natürlich einseitig einweisen, wie Sie MSMQ über WCF bedienen, dann sind die Operationen normalerweise auf den Einweg eingestellt.

Wenn Sie also etwas zurückgeben möchten, um den Aufrufstatus anzuzeigen, ist ein Einweg keine korrekte Auswahl, Sie können einfach den normalen WCF-Betrieb verwenden, der stattdessen nicht eins ist.

Für den Einwegbetrieb ist hier ein Artikel für Ihre Referenz WCF-Einweg

Ich habe das Gefühl, dass Sie das richtig gemacht haben.Für jede Art von Client (C #, Java, C ++, PHP) benötigen sie nur WSDL, um den Proxy zu erstellen.Ich habe das Gefühl, dass es auch in anderen Sprachen arbeiten sollte.Am besten, um SOAPUI (neutraler SOAP-Client) zu verwenden, um Ihren Dienst zu testen.

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