有一个
PHP文件充当web服务,并且有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>
问题是webservice和wsdl所在的计算机的IP地址是192.168.1.123,我从PHP Web服务调用函数时获取数据!那么< soap:地址标签不是必需的吗?
简短回答:地址只是一个指示(对于生成代码和配置的开发人员或工具),可以访问服务的位置以及期望的URL类型.
答案很长:如果你看一下WSDL schema,你会发现port元素被定义为只包含一个名字和绑定属性,所以这就足够了.您的服务元素看起来像这样,它在技术上是正确的:
<service name="ClientService"> <port name="ClientPort" binding="typens:ClientBinding" /> </service>
但是port也被定义为一个可扩展元素,它允许将其他命名空间中的元素添加到它(例如< soap:address>).
通常(是的!)< soap:地址>应该说明实际服务所在的位置,但不幸的是,由于不同的因素,它并不总是如此:
>某些服务器地址已更改,人们忘记更新WSDL文件(对于contract first创建的WSDL);
> WSDL是由框架(contract last)自动生成的,框架无法知道Web服务暴露在哪个外部地址,因此它添加了一些默认地址和它知道的东西(如本地IP或机器名);
>你有一个中央WSDL,它描述了3个相同的部署服务(一个在DEV中,一个在UAT中,一个在PROD中),你不能为所有3个服务添加一个地址;
>等等
WSDL主要用于生成客户端代码.完成后,您不再需要WSDL,只需要一个URL即可连接到已部署的Web服务.该地址作为工具添加一些默认配置的提示,稍后您将替换为调用的REAL地址.
理想情况下,WSDL中的内容应该等于真实地址,但是这些信息通常会通过维护任务而落后,而事情最终会过时.您应该指定一个作为提示,即使它只是< soap:address location =“http://localhost/imfmobile/webservice/InterfaceTransfererClient.PHP”/>.