„Powielona nazwa pliku” dla tej samej przestrzeni nazw WSDL podczas korzystania z usługi internetowej z różnych subdomen

Przedmowa

Dostarczamy klientom nasze API usług.

Każdy klient ma własną subdomenę (np. Sergii.ourwebsite.com) i własny adres URL WSDLhttp://sergii.ourwebsite.com/api/bsapi.cfc?wsdl

Również wszystkie strony internetowe (w tym oczywiście API) używające tej samej bazy kodu.


Problem

Powiedz dwie aplikacje na tym samym serwerze CF. Może się to zdarzyć łatwo, ponieważ niektóre witryny klientów są hostowane na naszych serwerach.

Obaj próbują użyć własnego WSDL API, powiedzmy:

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

I tu pojawiają się problemy.

Gdy druga witryna próbuje zarejestrować usługę internetową, CF zgłosi błąd:

Imię:https://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl. WSDL:https://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl. org.apache.axis.wsdl.toJava.DuplicateFileException: Powielona nazwa pliku: /opt/coldfusion8/stubs/WS1985941973/api/Bsapi.java. Wskazówka: możesz przypisać dwie przestrzenie nazw elementami o tej samej nazwie do tej samej nazwy pakietu. Zaleca się użycie przeglądarki internetowej do pobrania i sprawdzenia żądanego dokumentu WSDL, aby upewnić się, że jest poprawny. Jeśli żądanego dokumentu WSDL nie można pobrać lub jest on dynamicznie generowany, prawdopodobne jest, że docelowa usługa sieciowa ma błędy programowania.

Problem polega na tym, że oba używają tej samej przestrzeni nazw WSDL, zbudowanej ze ścieżki CFC:

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


Aktualne rozwiązanie

Jedynym działającym rozwiązaniem jest używanie aliasów CFC, takich jak:

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

Każda ta CFC rozszerza rodzica w ten sposób:

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

Tworzą różne przestrzenie nazw, które mogą być używane bez problemów - własna przestrzeń nazw dla każdej aplikacji:

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


To dość głupie obejście, ale na razie działa.


Innym rozwiązaniem byłoby użycie pojedynczej subdomeny API i identyfikacja klientów za pomocą jakiegoś klucza (korzystamy już z nich w celach bezpieczeństwa), ale ma to poważne negatywne problemy z powodu jakiegoś starszego kodu.


Pamiętaj, że nie znam języka Java, więc wiele konkretnych porad nie jest dla mnie tak oczywistych.

Google pokazuje, że ten problem istnieje od lat, ale nie mogę znaleźć inteligentnego rozwiązania.

Więc może tutaj?

questionAnswers(4)

yourAnswerToTheQuestion