«Дублирующее имя файла» для того же пространства имен WSDL при использовании веб-службы из разных поддоменов

Preface

Мы предоставляем клиентам наш сервис API.

У каждого клиента есть собственный поддомен (например, sergii.ourwebsite.com) и собственный URL-адрес WSDL.http://sergii.ourwebsite.com/api/bsapi.cfc?wsdl

Также все сайты (включая API, конечно) используют одинаковую кодовую базу.


Problem

Скажем, два приложения на одном CF-сервере. Это может легко произойти, потому что некоторые из веб-сайтов клиентов размещены на наших серверах.

Оба пытаются использовать собственный API WSDL, говорят:

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

И тут возникают проблемы.

Когда второй сайт пытается зарегистрировать веб-сервис, CF выдает ошибку:

Name: https://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl. WSDL: https://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl. org.apache.axis.wsdl.toJava.DuplicateFileException: Duplicate file name: /opt/coldfusion8/stubs/WS1985941973/api/Bsapi.java. Hint: you may have mapped two namespaces with elements of the same name to the same package name. It is recommended that you use a web browser to retrieve and examine the requested WSDL document to ensure it is correct. If the requested WSDL document cannot be retrieved or is dynamically generated, it is likely that the target web service has programming errors.

Проблема в том, что они оба используют одно и то же пространство имен WSDL, построенное из пути CFC:

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


Current solution

Единственное рабочее решение для нас - это использование псевдонимов CFC, например:

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

Каждый этот CFC расширяет родителя следующим образом:

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

Они создают разные пространства имен, которые можно использовать без проблем - собственное пространство имен для каждого приложения:

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


Это довольно тупой обходной путь, но пока он работает.


Другое решение состоит в том, чтобы использовать один поддомен API и идентифицировать клиентов по некоторому ключу (мы уже используем их в целях безопасности), но у нас есть серьезные негативные проблемы из-за некоторого устаревшего кода.


Обратите внимание, что я не знаю Java, поэтому многие конкретные советы мне не так понятны.

Google показывает, что эта проблема существует годами, но я не могу найти разумного решения.

Так может здесь?

Ответы на вопрос(4)

Ваш ответ на вопрос