5

我有一个由 wsgen 通过 maven 生成的 Web 服务。当我将服务部署到 Glassfish 时,它会将服务器 URL 放入 WSDL。我们的 Glassfish 服务器以 Apache 代理服务器为前端。

这一切意味着当有人访问我们的 WSDL 并查看服务端点时,他们看到的肥皂地址位置是

http://app server url/service...

代替

http://proxy server url/service...

我想我需要对一些项目进行澄清......

  1. 这个端点地址重要吗?如果端点地址与它们将调用以调用服务的代理服务器的 URL 不匹配,客户端是否仍然能够运行。这基本上提出了“ WSDL 到 Web 服务就像接口是对象”这样的问题。

    更新:在回答第一个问题时,似乎“ WSDL to web service as interface is to object ”。WSDL 中指定的端点地址并不重要。事实上,在与此处描述的 WSDL 中指定的端点不同的端点上调用 Web 服务操作是相对简单的。

    // 从生成的服务类创建服务和代理。
    HelloService 服务 = 新的 HelloService();
    HelloPort 代理 = service.getHelloPort();
    
    // 覆盖端点地址
    ((BindingProvider)proxy).getRequestContext().put(
            BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
            " http://new/endpointaddress ");
    proxy.sayHello("Hello World!");
    

  2. WSDL 是在我们部署到 Glassfish 时自动生成的。有没有一种简单的方法可以通过应用服务器设置覆盖 Glassfish 中生成的端点地址。如果是这样,我可以创建一个设置来自动将代理服务器 URL 放入生成的 WSDL。

如果 1 确实很重要并且我们不能以任何方式用 2 覆盖它,那么这基本上意味着我们需要为开发和生产进行单独的构建。这并不“感觉正确”,因为在我看来,要部署到另一台服务器,我们唯一需要做的就是将现有(和经过测试的)战争从一个环境放到新服务器上。

4

2 回答 2

5

事实证明,服务的部署位置有一个Server Name参数。HTTP Listener您可以从 Glassfish 管理控制台指定此值,Glassfish 将使用此名称而不是请求 URL 中的主机名。

不幸的是,如果您的应用服务器和代理服务器不使用相同的(我们的不使用),此参数将不允许您覆盖端口或协议(http 到 https)。

我所做的是为我的服务编写一个简单的 servlet 过滤器来为我处理这个问题。

于 2010-01-29T19:42:00.620 回答
4

我发现了一种我认为是处理该问题的非常简单的方法:在 Apache 中使用 mod_substitute。由于我们这些有这个问题的人已经在使用 Apache,而且它是内置的而且很简单,我最喜欢这种方法。

我在我的一个 Apache conf 文件中放置了一个类似于以下内容的块,并找到了乐趣:

<Location />
   AddOutputFilterByType SUBSTITUTE text/xml
   Substitute "s|http://internal:8080/xxx|https://external/xxx|ni"
</Location>
于 2013-08-08T21:36:41.187 回答