利用不同的子域的Web服务时,“重复文件名”为同一个WSDL命名空间(“Duplicate file

2019-07-30 03:05发布

前言

我们为客户提供我们的服务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,所以很多具体的建议是不适合我那么清楚。

谷歌显示,存在多年的这个问题,但我不能找到聪明的解决方案。

因此,也许在这里?

Answer 1:

我不能“的地方,在所有客户的共同URL的WSDL”现在,我已经解释了为什么:因为我必须使用子域。 如果你知道把WSDL的一个网址,使服务请求到其他的方式 - 请告诉我。

一个WSDL只是描述了Web服务的XML文档。 你可以用它写CFML(自定义)。 例如:

http://subdomain.domain.com/api/wsdl.cfm?api=bsapi&customer=subdomain

然后,只需复制由CF生成的WSDL,并使用它作为您的自定义WSDL页面的模板。 更换已经子域特有的WSDL的部分和返回的XML文档。 要留意的空白的(也许是见CFSilent , CFSetting ),并考虑使用CFHeader设置MIME类型为“text / xml”的。



Answer 2:

是否所有的客户都使用相同的WSDL? 然后放置在WSDL为所有客户的共同URL。

我还认为你需要找出错误消息意味着什么。 我看不出它有什么用正在使用的URL。 如果它已经提到另一位客户的URL,我已经明白。


这部分可能是由于我缺乏的CF是如何工作的认识。 特别是,这是什么“注册网络服务”,当两个客户做触发这一问题?

你有没有意识到,在网址<soap:address/>的WSDL元素只是一个提示? 在许多客户端,它可以被覆盖。 在.NET客户端,只需设置代理类的Url属性。 这应该让你有在一个地点一个WSDL,并且尚未有客户每个参考适当的子域,假设有一些方法把这些信息传达给他们。 举例来说,如果有一个方法可以让你知道哪些客户进行调用,那么也许你会收到一个URL调用,然后重定向到正确的URL,或者使用一个SOAP路由架构路由到正确的。

我希望你不改变从一个客户到另一个名称空间。 命名空间有无关的网址,即使他们碰巧看起来像URL。



Answer 3:

没有为CFCOMPONENT标签的命名空间属性。 您应该能够使用这种与cgi.host_name沿(?我在家的时候,没有文档)指定匹配被查询的子域命名空间。

就像是:

<cfcomponent namespace="http://#cgi.host_name#/api/v1n1/bsapi.cfc">


Answer 4:

当由位于同一本地主机的测试脚本(但不同的文件夹中)从本地主机试图CFINVOKE Web服务已经引起此错误消息。 声音“buggish”我。



文章来源: “Duplicate file name” for same WSDL namespace when using web-service from different sub-domains