使用本地 WSDL 发送到远程 URL

using a local WSDL to send to a remote URL

我正在尝试向本地打印机端点发出 SOAP 请求 - http://192.168.1.116/WebServices/PrinterService。通常要获得与端点相对应的 WSDL,您将 ?wsdl 附加到 URL 的末尾,但在这种情况下不起作用。

值得庆幸的是,可以从 https://docs.microsoft.com/en-us/windows-hardware/drivers/print/ws-print-v1-1 下载 WSDL。因此,我能够从本地文件系统读取它:

$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...'。这很可能是 localhost 被截断了。

我的问题是...如何才能使位于本地文件系统上的 WSDL 不总是 post 到本地主机?

我在 WebPackage 目录中做了 grep -r localhost . 并用 192.168.1.116 替换了所有这些实例,但我仍然收到错误。

有什么想法吗?

SoapClient 将使用 WSDL 中的地址进行调用。应该是这样的:

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

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

在您的 WSDL 文件中。 XML 前缀可能不同,但您应该在那里有一个或两个地址。将此地址替换为您希望客户拨打电话的地址。

要尝试的另一件事可能是为调用设置 location

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

看看是否可行。