【发布时间】:2009-07-13 14:19:22
【问题描述】:
前言
我们正在向客户提供我们的服务 API。
每个客户都有自己的子域(例如 sergii.ourwebsite.com)和自己的 WSDL URL,它看起来像 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
问题来了。
当第二个网站尝试注册 web-service 时,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。 提示:您可能已经映射了两个 具有相同元素的命名空间 name 为相同的包名。它是 建议您使用网络浏览器 检索和检查请求的 确保 WSDL 文档正确无误。 如果请求的 WSDL 文档不能 被检索或动态 产生,很可能是 目标 web 服务有编程 错误。
问题是它们都使用相同的 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 显示这个问题存在多年,但我找不到聪明的解决方案。
所以也许在这里?
【问题讨论】:
标签: coldfusion wsdl stub