Введение
Мы предоставляем клиентам наш сервис API.
У каждого клиента есть собственный поддомен (например, sergii.ourwebsite.com) и собственный URL-адрес WSDL, который выглядит как http://sergii.ourwebsite.com/api/bsapi.cfc?wsdl
Кроме того, все веб-сайты (включая, конечно, API) используют одну и ту же кодовую базу.
Задача
Скажем, два приложения на одном CF-сервере. Это может легко произойти, потому что некоторые из веб-сайтов клиентов размещены на наших серверах.
Оба пытаются использовать собственный API WSDL, скажем:
http://sergii.ourwebsite.com/api/bsapi.cfc?wsdl
http://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl
А вот и проблемы.
Когда второй сайт пытается зарегистрировать веб-сервис, CF выдает ошибку:
Имя:
https://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl.
WSDL:
https://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl.
org.apache.axis.wsdl.toJava.DuplicateFileException:
Дубликат имени файла:
/opt/coldfusion8/stubs/WS1985941973/api/Bsapi.java.
Подсказка: вы могли нанести на карту два
пространства имен с элементами того же
имя для того же имени пакета. это
рекомендуется использовать веб-браузер
получить и изучить запрошенный
WSDL документ, чтобы убедиться, что это правильно.
Если запрошенный документ WSDL не может
быть извлеченным или динамически
вероятно, что
целевой веб-сервис имеет программирование
ошибки.
Проблема в том, что они оба используют одно и то же пространство имен WSDL, построенное из пути CFC:
<wsdl:definitions targetNamespace="http://api">
Текущее решение
Единственное рабочее решение для нас - использование псевдонимов 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 показывает, что эта проблема существует годами, но я не могу найти разумное решение.
Так может здесь?