2008-09-15 2 views
10

Ich schreibe einen C# -Client, der einen in Java geschriebenen Webdienst aufruft (von einer anderen Person). Ich habe eine Webreferenz zu meinem Client hinzugefügt und kann Methoden im Webservice aufrufen.C# -Client schreiben, um einen Java-Webdienst zu verwenden, der ein Array von Objekten zurückgibt

Der Dienst wurde geändert, um ein Array von Objekten zurückzugeben, und der Client analysiert die zurückgegebene SOAP-Nachricht nicht ordnungsgemäß.

MyResponse[] MyFunc(string p) 

class MyResponse 
{ 
    long id; 
    string reason; 
} 

Wenn mein generierten C# Proxy den Webdienst (mit SoapHttpClientProtocol.Invoke) nennt, erwarte ich eine MyResponse [] Array mit einer Länge von 1, dh ein einzelnes Element. Was ich nach dem Invoke-Aufruf erhalte, ist ein Element mit id = 0 und Grund = null, unabhängig davon, was der Dienst tatsächlich zurückgibt. Mit einem Paket-Sniffer kann ich sehen, dass der Dienst eine scheinbar seriöse Nachricht zurückgibt, deren ID und Grund auf Nicht-Null-Werte gesetzt sind.

Gibt es einen Trick, einen C# -Client dazu zu bringen, einen Java-Webdienst aufzurufen, der someobject [] zurückgibt? Ich werde daran arbeiten, wenn nötig, eine gekühlte Demo zu bekommen.

Bearbeiten: Dies ist eine Webreferenz über "Add Web Reference ...". VS 2005, .NET 3.0.

+0

Verwenden Sie "Add Web Reference" (.NET 2.0) oder "Add Service Reference" (.NET 3.0)? –

Antwort

3

Es ist eine Weile her, aber ich erinnere mich daran, Probleme mit den geringfügigen Unterschieden bei der Behandlung von Namespaces zwischen .NET- und Java-Webdiensten zu haben.

Überprüfen Sie die generierte C# -Proxy-Klasse und alle darin deklarierten Namespaces (insbesondere die Standardwerte xmlns = "") anhand der vom Java-Dienst erwarteten Werte. Es wird wahrscheinlich sehr feine Unterschiede geben, die Sie neu erstellen müssen.

Wenn dies der Fall ist, werden Sie mehr Namespace-Deklarationen in den C# -Attributen angeben.

0

Aus Ihrer Frage scheint es, dass Sie den Client an einem Punkt arbeiten ließen, und dann wurde der Dienst geändert, um ein Array zurückzugeben. Stellen Sie sicher, dass Sie den Proxy erneut generieren, sodass die zurückgegebene SOAP-Nachricht auf dem Client deserialisiert wird. Es war nicht klar, dass du das getan hast - nur um sicher zu gehen.

+0

Ihr Verständnis ist richtig. Es hat funktioniert, bis ich die Methode, die MyResponse [] zurückgab, hinzugefügt habe. Ich habe die Referenz aktualisiert und der Proxy wurde neu erstellt. –

8

Dank Xian habe ich eine Lösung.

Die wsdl für den Dienst eine Zeile enthalten

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

Die Seife, die der Client an den Server gesendet das folgende Attribut auf alle Datenelemente hatten:

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

Aber die XML-Nutzlast des Antwort (vom Service zurück zum Client) hat nicht haben diesen Namespace enthalten. Durch Basteln mit der HTTP-Antwort (die ich mit WireShark erhalten habe), beobachtete ich, dass die .NET-Proxy-Klasse die MyResponse-Werte korrekt aufgenommen hat, wenn ich das xmlns-Attribut für jedes zurückgegebene Datenelement erzwang.

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

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

und kommentieren Sie die XmlType-Attributlinie. Dadurch wird die CLR angewiesen, im Standardnamespace nach Antwortelementen zu suchen, anstatt nach dem in der WSDL angegebenen.Sie müssen dies jedes Mal wiederholen, wenn Sie die Referenz aktualisieren, aber zumindest funktioniert es.

+0

Danke, dass du deine Lösung gepostet hast, sie hat eine Flut von Erinnerungen zurückgebracht! – Xian

Verwandte Themen