3

在我们的内部环境中,我有一个在 Tomcat 上运行的 Java 网络服务。假设wsdl是

http://actual:8080/app/temp?wsdl

为了从网络外部提供对该 Web 服务的访问,我们在另一台服务器上使用 Apache 创建了一个代理,并使用 ProxyPass 来执行类似的操作

ProxyPass /app/temp http://actual:8080/app/temp

所以在外部,当我们通过 http 访问 proxy/app/temp 时,它会被转移到 actual:8080/app/temp 就好了。所以没有问题,我也可以访问 wsdl。

但是 WSDL 引用了端口上的“webservice 位置”的“实际”服务器。当从客户端对 Web 服务方法进行实际调用时,这会导致失败。

请问有什么办法可以解决这个问题吗?谢谢。

注意:客户端是使用 Metro 生成的。我找到了一种使用如下代码强制客户端中的不同端点的方法。但我更多的是寻找我们可以做的纯代理解决方案,而不是使用我们的 web 服务的开发人员必须接触他们的代码。

((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://proxy/app/temp?wsdl");
4

1 回答 1

4

您可以使用ProxyPreserveHost指令。引用链接中指令的部分:

启用后,此选项会将 Host: 行从传入请求传递到代理主机,而不是 ProxyPass 行中指定的主机名

因此,您的配置文件中应该有以下内容:

ProxyPreserveHost On
ProxyPass /app/temp http://actual:8080/app/temp

然后重新启动apache服务器。使用此选项,您无需更改 Web 服务相关代码或设置中的任何内容。

于 2012-12-04T21:45:52.703 回答