C # Client Schreiben einer Java-Web-Service zu konsumieren, die Anordnung von Objekten zurückgibt

StackOverflow https://stackoverflow.com/questions/64833

  •  09-06-2019
  •  | 
  •  

Frage

Ich schreibe einen C # Client, der einen Web-Service in Java (von einer anderen Person) geschrieben aufruft. Ich habe eine Web-Referenz auf meine Client hinzugefügt und ich bin in der Lage Methoden in der Web-Service ok rufen.

Der Service geändert wurde ein Array von Objekten zurück, und der Client die zurück SOAP-Nachricht nicht richtig analysieren.

MyResponse[] MyFunc(string p)

class MyResponse
{
    long id;
    string reason;
}

Wenn mein generierten C # Proxy ruft den Webdienst (mit SoapHttpClientProtocol.Invoke), erwarte ich eine MyResponse [] Array mit einer Länge von 1, dh ein einzelnes Element. Was ich nach dem Invoke Anruf bekommen ist ein Element mit id = 0 und Grund = null, unabhängig davon, was der Dienst tatsächlich zurückgibt. Mit einem Paket-Sniffer, ich kann sehen, dass der Dienst zurückkehrt, was eine legitime Seife Nachricht mit der ID und Grunde zu Nicht-Null-Werten festgelegt sein.

Gibt es einen Trick, um eine C # Client immer eine Java-Web-Service aufrufen, die Someobject zurück []? Ich werde arbeiten, um eine hygienisiert Demo bei Bedarf zu bekommen.

Bearbeiten : Dies ist eine Web-Referenz über "Webverweis hinzufügen ...". VS 2005, .NET 3.0.

War es hilfreich?

Lösung

Es ist schon eine Weile, aber ich mich zu erinnern, Probleme, mit den geringen Unterschieden in Standardnamensraum zwischen .Net und Java Web Services abgewickelt wurden.

Überprüfen Sie die erzeugte c # Proxy-Klasse und alle innerhalb von (vor allem die Standardwerte xmlns = „“) erklärt Namespaces, gegen das, was die Java-Service erwartet. Es wird wahrscheinlich sehr subtile Unterschiede, die Sie müssen neu erstellen.

Wenn dies der Fall ist, dann werden Sie mehr Namespace-Deklarationen in den c # Attributen zur Verfügung zu stellen.

Andere Tipps

Dank Xian, ich habe eine Lösung.

Die wsdl für den Dienst eine Zeile enthalten

<import namespace="http://mynamespace.company.com"/>

Die Seife, die der Client mit dem Server hatte das folgende Attribut auf allen Datenelementen gesendet:

xmlns="http://mynamespace.company.com"

Aber die xml Nutzlast der Antwort (vom Service zurück an den Client) tat nicht hat diesen Namensraum enthielt. Durch die Bastelei mit der HTTP-Antwort (die ich erhielt mit Wireshark ), bemerkte ich, dass die .NET-Proxy-Klasse richtig die MyResponse Werte aufgenommen, wenn ich die xmlns gezwungen Attribut auf jedem Datenelement zurückgegeben.

Kurz den Dienst zu ändern, die ich nicht kontrollieren, die Abhilfe ist der VS generierten Proxy-Klasse (zB Reference.cs) und suchen Sie nach Zeilen wie diese zu bearbeiten:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mynamespace.company.com")]
public partial class MyResponse {

und kommentiert die XmlType Attributzeilen aus. Dadurch wird die CLR sagt für Response-Elemente in dem Standard-Namespace zu suchen, anstatt die in der WSDL-Datei specied. Sie haben dies zu wiederholen, wenn Sie die Referenz aktualisieren, aber zumindest funktioniert es.

Aus Ihrer Frage, es sieht aus wie Sie den Client hatten an einer Stelle zu arbeiten, und dann wurde der Dienst verändert ein Array zurück. Stellen Sie sicher, dass Sie den Proxy neu generiert werden, so dass die zurück SOAP-Nachricht auf dem Client deserialisiert. Es war nicht klar, dass Sie das getan hatten -. Nur sicherstellen, dass

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