我想mod_proxy
在托管 SOAP Web 服务的 IIS 前面有一个反向代理(apache httpd with )。
我面临的问题是 SOAP 客户端通过WSDL
从端点下载来向 Web 服务器询问有关 Web 服务的详细信息。此 WSDL 由 Web 服务生成,它包含客户端应使用的 Web 服务的 URL。问题在于,当 Web 服务位于代理后面时,生成的 URL 包含错误的私有地址。
IIS Web 服务位于,
http://internal.host.com/Dirname/Service.asmx
可以使用GET
或调用POST
。
使用 GET 检索 WSDL,并将其WSDL
作为查询字符串:
http://internal.host.com/Dirname/Service.asmx?WSDL
反向代理将 Web 服务呈现为:
https://proxy.host.com/VirtualDir/Service.asmx
我的问题是动态生成的 WSDL 的内容包含内部 URL(代理连接到的)。
我想避免破解/重新编译 Web 服务本身,所以当我考虑替代解决方案时,我想知道这一点;
我可以httpd
在代理服务器上以某种方式拦截对 ?WSDL 文档的调用并改为提供静态内容,并且仍然将其他查询(包括 GET 参数)转发到内部 IIS 服务器吗?
相关的 httpd 配置当前如下所示:
ProxyPass "/VirtualDir/" "http://internal.host.com/Dirname/"
而且我在想也许 RewriteCond 和 RewriteRule 可以以某种聪明的方式使用来仅捕获对 的请求/.../Service.asmx?WSDL
并提供静态本地文档,然后将“其余的”转发给 IIS,但我真的不知道如何在不破坏其他任何东西的情况下正确地做到这一点。
反向代理也用于其他服务,在其他虚拟“目录”下。
我暂时解决了这个问题,方法是创建一个静态 WSDL 规范,其中包含服务方法的正确(代理)地址,并告诉客户端改用那个地址。
它似乎工作得很好,但每次 WebService 接口更改时都必须更新它。
我在这个地址的代理 apache http 上设置了一个静态文件:
它包含正确的 WSDL 规范以及要使用的公共 URI。我从 IIS 下载了它,
wget
然后用文本编辑器修复了它。