为什么即使wsdl中的IP地址错误,web服务也会返回数据?

时间:2012-04-03 12:02:12

标签: php web-services wsdl

PHP个文件作为webservice,并且wsdl文件中有这些行:

<service name="ClientService">
    <documentation></documentation>
    <!-- partie 8 : Port -->
        <port name="ClientPort" binding="typens:ClientBinding">
            <soap:address location="http://192.168.1.12/imfmobile/webservice/InterfaceTransfererClient.php"/>
        </port>
</service>

问题是webservicewsdl所在的计算机的IP地址是192.168.1.123,我在从PHP网络服务调用函数时获取数据!那么<soap:address标签不是必需的吗?

1 个答案:

答案 0 :(得分:4)

简答:该地址只是(可用于生成代码和配置的开发人员或工具)指示可以访问服务的位置以及期望的URL类型。

答案很长:如果查看WSDL schema,您会看到port元素定义为仅包含name和{{1}属性,这样就足够了。您的服务元素看起来像这样,它在技术上是正确的:

binding

<service name="ClientService"> <port name="ClientPort" binding="typens:ClientBinding" /> </service> 也被定义为一个可扩展元素,它允许将其他命名空间中的元素添加到其中(如port)。

通常(是的!)<soap:address>应说明实际服务的公开位置,但不幸的是,由于不同的因素,它并不总是如此:

  • 某些服务器地址已更改,人们忘记更新WSDL文件(对于contract first创建的WSDL);
  • WSDL是由框架(contract last)自动生成的,框架无法知道Web服务暴露在哪个外部地址,因此它会添加一些默认地址和它知道的东西(比如本地IP)或机器名称);
  • 你有一个中央WSDL,它描述了3个相同的部署服务(一个在DEV中,一个在UAT中,一个在PROD中),你不能为所有这三个服务添加一个地址;
  • 等等

WSDL主要用于生成客户端代码。完成后,您不再需要WSDL,只需要一个URL即可连接到已部署的Web服务。该地址作为工具添加一些默认配置的提示,您稍后将替换为调用的REAL地址。

理想情况下,WSDL中的内容应该等于真实地址,但这些信息通常会通过维护任务而落后,最终会过时。您应该指定一个提示,即使它只是<soap:address>