Ich verwalte einen SOAP-Webservice (ASP.NET Version 2.0) und muss einige Änderungen vornehmen, die die Rückgabewerte bestimmter Methoden ändern.
Was ist die allgemein akzeptierte Methode, dies ohne bestehende Implementierungen zu brechen.
Meine anfänglichen Gedanken sind, dass das Folgende möglich wäre.
a) Bereitstellung neuer versionsspezifischer Methoden innerhalb des bestehenden Webdienstes, z. getPerson_v1.4
b) Stellen Sie eine vollständige Kopie der ASMX-Datei mit einer neuen Versionsnummer bereit, z. http: /www.example.com/AdminWS_V1_4.asmx. Dies ist keine Idee, die ich genieße, da der Dienst mehr als 50 Methoden hat und das Kopieren des Codes für Änderungen an 2/3 Methoden zu viel Duplikatencode erscheint.
c) Überschreiben Sie den Web-Service-Konstruktor, um die Übergabe einer Versionsnummer zu ermöglichen. Das scheint nicht zu funktionieren, und ich bin mir bei der Reflektion nicht sicher, wie dies in einer WSDL dargestellt werden würde.
Gibt es einen allgemein akzeptierten Weg, oder haben die Menschen aufgrund ihrer Erfahrungen in diesem Bereich einen Ratschlag?
Im allgemeinen Fall gibt es für die Versionierung eines Webdienstes mehr als nur Versionsmethoden und ASMX-Dateinamen. Im Idealfall sollte die Schnittstelle zu einem Webdienst (WSDL) ein unbefristeter Vertrag sein und sollte sich niemals ändern. Eine der Implikationen wäre, dass Clients, die die geänderten Funktionen nicht benötigen, sich nie ändern müssen und daher nie erneut getestet werden müssen.
Anstatt den bestehenden Vertrag zu brechen, sollten Sie einen neuen Vertrag anlegen, der die geänderten Vorgänge enthält. Dieser Vertrag könnte von dem bestehenden Vertrag "erben", d. H. Sie könnten "die Methoden bis zum Ende hinzufügen". Beachten Sie jedoch, dass Sie den neuen Vertrag auch in einen neuen XML-Namespace aufnehmen sollten - der Namespace identifiziert im Wesentlichen die WSDL und den Namespace, aber das Ändern der WSDL wäre eine Lüge.
Sie sollten diesen neuen Vertrag dann an einem neuen Endpunkt (ASMX-Datei) implementieren. Ob das in einem anderen Verzeichnis oder auf einer anderen Website ist, spielt keine Rolle. Es kommt darauf an, dass Clients, die die neue Funktionalität wünschen, unter der neuen URL auf die neue WSDL verweisen und den neuen Service unter der neuen URL aufrufen können, und seien Sie glücklich.
Beachten Sie, dass die Änderung eines bestehenden Vertrags zu dem Ergebnis führt, dass bei der nächsten Aktualisierung eines Web Reference der Code der Client-Proxy-Klassen geändert wird. In den meisten Shops erfordert das Ändern von Code erneutes Testen und erneutes Bereitstellen. Sie sollten daher "nur Methoden hinzufügen" als "Hinzufügen von Clientcode, der getestet und bereitgestellt werden soll" denken, auch wenn der vorhandene Clientcode die neuen Methoden nicht verwendet.
Ich habe gerade an eine andere mögliche Lösung gedacht, die ziemlich sauber scheint.
Ich könnte nach einer Versionsnummer suchen, die als SOAP-Header enthalten ist, und die vorhandene Versionsnummer annehmen, wenn diese nicht angegeben wird.
Ich kann dann den Code für verschiedene Versionen unterschiedlich gestalten, ohne die Methodensignaturen zu ändern. Dies ist möglich, da die Rückgabewerte der Web-Services XML-Objekte sind, also bleibt die Methodensignatur gleich, aber der Inhalt des XML ändert sich je nach Version.
Ich habe das gleiche Problem mit der Versionierung von Webservices, die ich gerade entwickle. Wir lassen unsere Benutzer eine Schemaversionsnummer in der Kopfzeile übergeben. Sie sagen uns, welche Version des XML-Schemas sie wollen. Auf diese Weise sind wir immer abwärtskompatibel und der Code wird nicht dupliziert.
In meinem Job können wir dem Kunden nicht sagen, dass er die URL zum Webservice wechseln muss, wenn wir ihn versionieren. In großen Unternehmen können Änderungen, die so klein wie eine URL sind, Monate dauern. Es ist mein Gefühl, dass Sie Ihre Kundenverbindung nicht unterbrechen sollten. Was wir tun, ist, der neuesten Version neue Funktionen hinzuzufügen. Wenn der Client nach den neuen Funktionen fragt, werden sie gezwungen, auf das neueste Schema zu aktualisieren, wenn sie dies wünschen.
Wenn Sie die meisten Methodensignaturen nicht mit jeder neuen Version ändern, würde ich mit (a) - versionierten Methodennamen gehen. So machen es unsere Provider und es funktioniert für uns.
Tags und Links .net asp.net soap versioning