前言
我们为客户提供我们的服务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
而来到这里的问题。
当第二个网站尝试注册网络服务,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。 提示:你可能已映射两个命名空间与相同的包名同名的元素。 建议您使用Web浏览器来检索和审查请求的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,所以很多具体的建议是不适合我那么清楚。
谷歌显示,存在多年的这个问题,但我不能找到聪明的解决方案。
因此,也许在这里?