Ich verwende einen Webservice eines anderen Unternehmens, der in mehreren Versionen läuft. Jede neuere Version hat nur neue Felder/Objekte hinzugefügt, aber einige der Elementnamen geändert.
Ich möchte die Möglichkeit haben, jede der Versionen mit demselben Code zu verwenden.
Konkret: In einer Version gibt eine Suchmethode zurück: <searchReturn><SummaryData_Version1Impl /><SummaryData_Version1Impl /></searchReturn>
und in einer anderen Version: <searchReturn><SummaryData_Version2Impl /><SummaryData_Version2Impl /></searchReturn>
Daher kann der von wsdl.exe generierte Proxy aufgrund dieser Elementänderung nicht mit beiden arbeiten.
- Die beste Lösung wäre, das andere Unternehmen zu veranlassen, seinen Dienst so zu ändern, dass die Elementnamen nicht mehr geändert werden, aber das ist in dieser Situation eher unwahrscheinlich
- Ich denke, meine beste Wette für eine funktionierende Lösung ist zu senden und erhalten die SOAP-Anfrage manuell, und ändern Sie die Elementnamen dann deserialize manuell, die bisher wie es funktionieren würde schien. -- Aber würde ziemlich viel Arbeit erfordern
- Ich habe gerade bestätigt, dass das manuelle Laden der XML-Datei (nach dem Ändern des Elementnamens mit string.Replace) jede Version des Dienstes in die benötigten Objekte deserialisiert
- Alternativ können Sie auch den generierten Proxy ändern:
- Wenn ich die Soap-Antwort abfangen und ändern könnte, bevor der generierte Proxy versucht, sie zu deserialisieren
- Wenn ich das XmlTypeAttribute des Dienstes zur Laufzeit ändern könnte
- Ich habe auch daran gedacht, eine Reihe von Schnittstellen zu haben, so dass jede Klasse die Schnittstellen der älteren Klassen hat.
class Data3 : IData3, IData2, IData1
Das würde es mir erlauben, zumindest nach unten zu werfen. Und setzen Sie jede Version in einem anderen Namensraum. - Es gibt ein paar Enten-Tipptechniken, die ich mir gerade angeschaut habe, die vielleicht funktionieren könnten, aber weniger zuverlässig erscheinen.
- Gibt es eine andere Möglichkeit, aus mehreren Elementnamen zu deserialisieren?