26 Stimmen

Problem mit dem WCF-Client beim Aufruf einer Einwegoperation

Ich habe ein Problem beim Aufrufen eines Webdienstes auf einem SAP PI-Bus von meinem WCF-Client festgestellt. Die Operation ist als Einweg definiert, und die Methode auf meinem Proxy-Operationsvertrag ist entsprechend dekoriert, wenn der Servicereferenz hinzugefügt wird. Der Dienstclient erhält jedoch eine Ausnahme, wenn die entsprechende Operation aufgerufen wird:

Die Einweg-Operation hat eine Nachricht mit Action='' zurückgegeben

Unter Verwendung von SoapUI kann die Methode auf dem Bus erfolgreich aufgerufen werden, und sie gibt einen SOAP-Umschlag mit leerem Body zurück. Die Bus-Leute haben mir gesagt, dass dies den SOAP-Spezifikationen entspricht:


(SOAP-Spezifikationen, Kapitel 4.7.9, Einweg-Operationen):

Es gibt unterschiedliche Interpretationen darüber, wie HTTP bei der Durchführung von Einweg-Operationen verwendet werden soll.

R2714 Für Einweg-Operationen DARF eine INSTANZ KEINE HTTP-Antwort zurückgeben, die einen Umschlag enthält. Speziell muss der HTTP-Antwort-Entity-Body leer sein.

R2750 EIN VERBRAUCHER muss einen in einer HTTP-Antwortnachricht in einer Einweg-Operation transportierten Umschlag ignorieren.

R2727 Für Einweg-Operationen darF EIN VERBRAUCHER NICHT einen erfolgreichen HTTP-Antwortstatuscode (d.h. 2xx) interpretieren, um zu bedeuten, dass die Nachricht gültig ist oder dass der Empfänger sie verarbeiten würde.


Es scheint also, dass mein WCF-Client nicht mit R2750 übereinstimmt.

Ich habe herausgefunden, dass wenn ich den Betriebsvertrag auf dem Proxy erzwinge, IsOneWay = false zu sein, funktioniert alles.

Gibt es etwas falsch mit der Art und Weise, wie WCF Einweg-Operationen behandelt oder mache ich etwas falsch (wahrscheinlicher)? Sollte ich noch etwas anderes tun, es scheint einfach nicht richtig zu sein, den generierten WCF-Proxy-Client zu überschreiben.

Vielen Dank für alle Vorschläge.

2 Stimmen

Tolle Frage +1. Ich würde behaupten, dass ihre Seite auch nicht mit R2714 übereinstimmt. Bitte erwägen Sie, einen Vorfall bei Microsoft zu melden und uns mitzuteilen, was das Ergebnis ist.

0 Stimmen

Ähnliche Frage (und weitere Informationen): stackoverflow.com/q/4510484/46039

0 Stimmen

Link zur SOAP-Spezifikation 4.7.9 Einweg-Operationen: ws-i.org/profiles/basicprofile-1.1.html

17voto

Brian Low Punkte 11205

Es sieht so aus, als ob SAP PI fälschlicherweise einen leeren SOAP-Umschlag sendet und .NET diesen Umschlag fälschlicherweise interpretiert.

Einige Optionen aus diesem Thread:

  • Ändern Sie den generierten Proxy und entfernen Sie OneWay=true (oder fügen Sie OneWay=false) zur Methodendefinition hinzu
  • Fangen Sie die Protokollverletzung in einem Ausnahmehandler ab und ignorieren Sie sie
  • Verwenden Sie eine Webreferenz im Stil von 2.0, um den Dienst aufzurufen
  • Wenden Sie den SAP-Patch Hinweis 1459995 - Soap-Senderadapter HTTP 202 an und fügen Sie &responsecode202=true zur URL hinzu

Die ersten und letzten Optionen haben bei mir beide funktioniert. Weitere Diskussionen dazu finden sich in diesem sap.com-Thread.

0 Stimmen

Danke dafür, es ist immer noch relevant für mich.

0 Stimmen

Ich denke, dass eine Antwort von einem Webdienstaufruf immer mit einer Bestätigung zurückkommen sollte, aus systemischer Perspektive. Wahr oder falsch, 1 oder 0, um anzuzeigen, dass deine Nachricht von der anderen Seite empfangen und verarbeitet wurde.

0 Stimmen

Letzte Option hat bei mir mit SAP PI 7.3.1 und .NET 4.7.2 funktioniert.

4voto

Bryan Corazza Punkte 819

Ich würde mir auch diesen Artikel von Gerben van Loon hier ansehen. Eine Einweg-Operation ist möglicherweise laut den Standards nicht wirklich einweg.

1 Stimmen

Die Semantik von Einweg-Webaufrufen über SOAP ist vergleichbar mit void(), nicht mit Fire-and-Forget. Genau wie bei einer Methode, die void() zurückgibt, ist die Aufforderung blockierend und hat die Möglichkeit, eine Ausnahme "zurückzugeben".

1voto

StuckOverflow Punkte 971

Überprüfen Sie diesen SAP-Thread für die vollständige Diskussion: http://scn.sap.com/thread/1627368

@Brian Low hat diese Frage richtig und sehr gründlich beantwortet (es sollte als Antwort markiert werden).

Ich möchte auch hinzufügen, dass es sich hierbei um einen bekannten Fehler handelt, bei dem der SOAP-Adapter nicht mit dem oben genannten WS-I Basic Profile 1.1 (R2750) übereinstimmt und WCF nicht mit (R2750) übereinstimmt. Das Ergebnis... Stunden verschwendeter Zeit und Zähneknirschen....

0voto

Ethan Cabiac Punkte 4903

Ich glaube, dass dieses spezielle Problem behoben werden kann, indem die folgende Attributsdeklaration zur Operation im Client-Proxy hinzugefügt wird:

[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]

0 Stimmen

Vielen Dank für Ihre Antwort. Das Hinzufügen dieses Codes zum generierten Client-Proxy entspricht jedoch ungefähr dem Setzen der OneWay-Eigenschaft auf false. Leider hat es nicht funktioniert.

0voto

Russ Punkte 3983

Ohne zu sehen, wie die Signatur der Methode aussieht, ist mein bester Tipp, dass Ihre Methode definiert ist, etwas anderes als "void" zurückzugeben. Da der Vorgang nur in eine Richtung geht, kann die Methode nur mit "void" definiert werden (hat keinen Rückgabewert). Alles andere, und der Vorgang ist NICHT in eine Richtung.

0 Stimmen

Die Methode gibt tatsächlich void zurück.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X