使用来自不同子域的 Web 服务时,相同 WSDL 命名空间的“重复文件名”

2023-12-13

Preface

我们正在为客户提供我们的服务 API。

每个客户都有自己的子域(例如 sergii.ourwebsite.com)和自己的 WSDL URL,看起来像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

问题就来了。

当第二个网站尝试注册 Web 服务时,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: 重复的文件名: /opt/coldfusion8/stubs/WS1985941973/api/Bsapi.java。 提示:您可能已经映射了两个 具有相同元素的命名空间 命名为相同的包名。这是 建议您使用网络浏览器 检索并检查所请求的 确保 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,所以很多具体的建议对我来说不太清楚。

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

那么也许在这里?


我现在无法“将 WSDL 放置在所有客户的通用 URL 上”,我已经解释了原因:因为我必须使用子域。如果您知道如何将 WSDL 放在一个 URL 并向另一个 URL 发出服务请求,请告诉我。

WSDL 只是描述 Web 服务的 XML 文档。您可以使用 CFML 编写(自定义)它。例如:

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

然后只需复制 CF 生成的 WSDL,并将其用作自定义 WSDL 页面的模板即可。替换 WSDL 中特定于子域​​的部分并返回 XML 文档。注意空白(也许看到CFSilent, CF设置),并考虑使用CFHeader将 mime 类型设置为“text/xml”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用来自不同子域的 Web 服务时,相同 WSDL 命名空间的“重复文件名” 的相关文章

随机推荐