Web Services 使用本地WSDL发送到远程URL

vbopmzt1  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(257)

我正在尝试向本地打印机端点http://192.168.1.116/WebServices/PrinterService发出SOAP请求。通常,要获取与端点对应的WSDL,您需要在URL的末尾附加?wsdl,但在本例中,这样做不起作用。
幸运的是,WSDL可以从https://learn.microsoft.com/en-us/windows-hardware/drivers/print/ws-print-v1-1下载,因此我可以从本地文件系统读取它:

$client = new SoapClient(dirname(__FILE__) . '/WebPackage/WSDPrinterService.wsdl', ['trace' => 1]);
$client->SendDocument();

问题是此代码总是错误地输出以下内容:

[29-Dec-2021 14:39:11 America/Chicago] PHP Fatal error:  Uncaught SoapFault exception: [HTTP] Could not connect to host in /home/neubert/test.php:9
Stack trace:
#0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'http://localhos...', 'http://schemas....', 1, 0)
#1 /home/neubert/test.php(9): SoapClient->__call('SendDocument', Array)
#2 {main}
  thrown in /home/neubert/test.php on line 9

__doRequest$location)的第二个参数是“http://localhos ...”。这很可能是本地主机被截断。
我的问题是......我如何才能使驻留在本地文件系统上的WSDL不总是发布到localhost?
我在WebPackage目录中执行了grep -r localhost .,并将所有这些示例替换为192.168.1.116,但仍然出现错误。
有什么想法吗?

20jt8wwn

20jt8wwn1#

SoapClient将使用WSDL中的地址进行调用。应该有如下内容:

<soap:address location="http://localhost...etc..."/>

<soap12:address location="http://localhost...etc..."/>

XML前缀可能不同,但应该有一个或两个地址。请将此地址替换为希望客户端调用的地址。
另一种尝试方法是为调用设置location

$client = new SoapClient(dirname(__FILE__) . '/WebPackage/WSDPrinterService.wsdl', ['trace' => 1]);
$client->__setLocation('http://192.168.1.116/WebServices/PrinterService');

看看能不能成功。

相关问题