16

我可以在 WSDL 中拥有相对于 WSDL 位置或至少相对于服务器的soap:address 位置吗?例如我想写:

<soap:address location="https://exampleserver.com/axis2/services/ExampleService" />

作为:

<soap:address location="/axis2/services/ExampleService" />

这将能够更快地部署到多个服务器,例如测试服务器。此外,对于axis2c,如果我希望我的服务同时从HTTP 或HTTPS 中使用,那么对于使用我的服务的开发人员来说,生活变得更加困难,因为他们不能简单地从它的默认位置“?WSDL”导入WSDL。

4

3 回答 3

8

WSDL 向客户端描述与 Web 服务交互所需的消息格式、类型、参数等。然后,WSDL2C等工具使用它来生成交互所需的代码。

但即使你在 HTTP 或 HTTPS 上公开你的服务,客户端存根代码也是一样的。您不会为每个端点地址重新生成客户端存根。客户端保持不变,改变的是接入点。

此地址不应在生成的客户端代码中硬编码,它必须是客户端应用程序内的可配置 URL。

当然,您在 WSDL 中指定了一个 URL,当您在开发服务器中部署 Web 服务,然后将其部署到生产环境中时,这很麻烦。每个环境中的端点会有所不同(对于 HTTP + HTTPS,可能会乘以 2),但此时您的开发人员不会受到影响,因为您不会重新生成代码。

在访问 Web 服务时,您仍然会有不同的地址(用于开发、登台和生产服务器),即使它是相对于某物或绝对的。所以我看不出在 WSDL 中有相对地址有什么帮助,因为您仍然必须将访问点管理到客户端配置中。

于 2011-09-02T19:49:36.223 回答
4

有两种获取 WSDL 的方法。

提供硬编码 wsdl 的服务,例如:

https://hostname/contextname/services/myAPIService/myAPI.wsdl

另一个提供生成的 wsdl 的服务,例如:

https://hostname/contextname/services/myAPIService?wsdl

如果您使用动态选项,它将使用以下代码:

req.getRequestURL().toString();

获取将在生成的 WSDL 中使用的 URL。这段代码在ListingAgent 类中(在包org.apache.axis2.transport.http 中)。

从您在问题中提到的内容来看,如果您想拥有相对位置,那一定是因为您想在多个服务器中使用它,因此您需要使用动态选项。

我发现动态选项的一个问题是,如果在原始 WSDL 中该位置使用 HTTP,那么在生成的位置中,即使您使用 HTTPS 访问它,它仍将使用 HTTP。(这发生在我的项目正在使用的版本 1.5 中)

另一个问题是如果您使用的是负载均衡器,因为生成的 WSDL 将使用最终服务器的位置而不是均衡器的位置生成。一个选项是扩展类 AxisServlet 和 ListingAgent 来替换上面提到的代码。

于 2013-07-25T13:49:06.680 回答
3

经过长时间的搜索,我几乎可以确定soap:address'location属性必须是绝对 URL。如果您使用不同的环境,例如开发、测试和生产,这会使事情变得更加复杂。

也许一种解决方法是在客户端读取配置文件中的 URL 的第一部分(例如https://exampleserver.com)和 WSDL 的最后部分(例如/axis2/services/ExampleService),然后将它们组合起来以构建绝对路径。前者将允许您在环境之间切换。

于 2012-01-10T09:08:37.100 回答