"Doppelter Dateiname" für denselben WSDL-Namespace, wenn der Webdienst aus verschiedenen Unterdomänen verwendet wird

Vorwort

Wir stellen unseren Kunden unsere Service-API zur Verfügung.

Jeder Kunde hat eine eigene Subdomain (z. B. sergii.ourwebsite.com) und eine eigene WSDL-URLhttp://sergii.ourwebsite.com/api/bsapi.cfc?wsdl

Außerdem verwenden alle Websites (einschließlich API natürlich) dieselbe Codebasis.


Problem

Angenommen, zwei Anwendungen auf demselben CF-Server. Dies kann leicht passieren, da einige Kundenwebsites auf unseren Servern gehostet werden.

Beide versuchen, eine eigene API-WSDL zu verwenden, sagen:

http://sergii.ourwebsite.com/api/bsapi.cfc?wsdl
http://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl

Und hier kommen die Probleme.

Wenn die zweite Website versucht, den Webdienst zu registrieren, gibt CF einen Fehler aus:

Name:https://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl. WSDL:https://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl. org.apache.axis.wsdl.toJava.DuplicateFileException: Doppelter Dateiname: /opt/coldfusion8/stubs/WS1985941973/api/Bsapi.java. Hinweis: Möglicherweise haben Sie zwei Namespaces mit Elementen desselben Namens demselben Paketnamen zugeordnet. Es wird empfohlen, dass Sie einen Webbrowser verwenden, um das angeforderte WSDL-Dokument abzurufen und zu überprüfen, um sicherzustellen, dass es korrekt ist. Wenn das angeforderte WSDL-Dokument nicht abgerufen werden kann oder dynamisch generiert wird, weist der Ziel-Webdienst wahrscheinlich Programmierfehler auf.

Das Problem ist, dass beide denselben WSDL-Namespace verwenden, der aus dem CFC-Pfad erstellt wurde:

<wsdl:definitions targetNamespace="http://api">


Aktuelle Lösung

Die einzige funktionierende Lösung für uns ist die Verwendung der CFC-Aliase wie:

http://galashyn.ourwebsite.com/api/v1n1/bsapi.cfc?wsdl
http://galashyn.ourwebsite.com/api/v1n1/bsapi.cfc?wsdl

Jeder dieser CFC erweitert das übergeordnete Element folgendermaßen:

<cfcomponent output="false" extends="api.bsapi">
<!--- this component used to extend base api version 1.x --->
</cfcomponent>

Sie erzeugen unterschiedliche Namensräume, die problemlos genutzt werden können - eigener Namensraum für jede Anwendung:

<wsdl:definitions targetNamespace="http://v1n1.api">
<wsdl:definitions targetNamespace="http://v1n2.api">


Dies ist eine ziemlich blöde Umgehung, funktioniert aber erstmal.


Eine andere Lösung wäre, die einzelne API-Unterdomäne zu verwenden und die Kunden anhand eines Schlüssels zu identifizieren (wir verwenden sie bereits zu Sicherheitszwecken), der jedoch aufgrund von veraltetem Code schwerwiegende negative Probleme mit sich bringt.


Bitte beachten Sie, dass ich Java nicht kenne, daher sind mir viele spezifische Ratschläge nicht so klar.

Google zeigt, dass dieses Problem seit Jahren besteht, aber ich kann die intelligente Lösung nicht finden.

Also vielleicht hier?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage