【问题标题】:PHP Soap - Could not connect to hostPHP Soap - 无法连接到主机
【发布时间】:2012-01-19 12:31:37
【问题描述】:

我已经查看了其他解决方案,但找不到类似的问题:

这段代码可以正常工作:

$wsdlUrl = "https://pilot.prove-uru.co.uk/URUws/uru10a.asmx?wsdl";
$client = new soapclient($wsdlUrl);
print_r($client->__getFunctions());

但是当我尝试进行方法调用时:

$params = array("AddressLookupUK" => array("address" => array("Postcode" => "NE20 9RF"),
            'AccountName' => "xxxx",
            'Password' => "xxxx"));
$result = $client->AddressLookupUK($params);

我收到错误消息“SoapFault 异常:[HTTP] 无法连接到主机”。如果我将方法调用更改为

$result = $client->FalseMethod($params);

我返回“函数(“FalseMethod”)不是此服务的有效方法”,这表明它正在按预期连接。有没有人可以参考一下?

谢谢

【问题讨论】:

  • 在这里我要做的第一件事是破解Wireshark 并查看正在发出的HTTP 请求和响应。

标签: php asp.net web-services soap asmx


【解决方案1】:

这是我使用的代码,希望对某人有所帮助:

$wsdlUrl = "address.wsdl";  


$client = new soapclient($wsdlUrl);
$params = array('address' => array('Postcode' => $postcode, 'BuildingNo' => $buildingNo),
                'AccountName' => 'XXXX',
                'Password' => 'XXXX');              
$result = $client->AddressLookupUK($params);
$echoText = '';
if (is_null($result->AddressLookupUKResult))
{
    //tell the user nothing was returned
}
else
{
    //checks to see if the result set contains only one item
    if (is_array($result->AddressLookupUKResult->URUAddressFixed))
    {
        foreach($result->AddressLookupUKResult->URUAddressFixed as $item)
        {
            //use code like $item->BuildingNo to access the data
        }
    }
    else
    {
        //if there was there was more than one then access using something like
        $result->AddressLookupUKResult->URUAddressFixed->BuildingNo
    }
}

理查德

【讨论】:

    【解决方案2】:

    在 WSDL 中,您会看到端点定义:

    <wsdl:service name="URU10a">
        <wsdl:port name="URU10aSoap" binding="tns:URU10aSoap">
            <soap:address location="https://pilot.prove-uru.co.uk:8443/URUws/uru10a.asmx"/>
        </wsdl:port>
        <wsdl:port name="URU10aSoap12" binding="tns:URU10aSoap12">
            <soap12:address location="https://pilot.prove-uru.co.uk:8443/URUws/uru10a.asmx"/>
        </wsdl:port>
    </wsdl:service>
    

    我认为,您在连接 8443 端口时遇到问题。在我受限的网络中,该服务无法正常工作。

    编辑

    好的,我尝试通过更改 WSDL 使用标准 SSL 端口进行连接。我已将 WSDL 从https://pilot.prove-uru.co.uk/URUws/uru10a.asmx?wsdl 保存到我的硬盘驱动器,从端点定义中删除了端口号并尝试使用soapUI 进行连接。 万岁,我收到了回复。

    所以也许他们将服务从 8443 移到了 443,而没有更新 WSDL。或者它在两个端口下运行,但由于我们本地网络的限制,您(和我)无法连接 8443。无论如何,我认为您应该联系该服务的提供者并澄清这一点,而不是使用他们的 WSDL 的修补版本。

    【讨论】:

    • 啊,对了,我应该连接的原始 URL 是 pilot.prove-uru.co.uk:8443/URUws/uru10a.asmx?wsdl 但是当我调用 $client = new soapclient("pilot.prove-uru.co.uk:8443/URUws/uru10a.asmx?wsdl"); 我不断收到“SOAP-ERROR: Parsing WSDL”。我需要做一些特别的事情来针对非标准端口号创建一个新的肥皂客户端吗?谢谢
    • 您可以尝试下载 WSDL,删除端口号,将您编辑的 WSDL 保存在您的项目文件夹中,然后从文件系统中加载它:$client = new soapclient("myOwn.wsdl");。如果服务真的在 SSL 默认端口上运行,这应该可以工作。
    • 奇怪的是我在服务器上安装了soapUI,我在拨打电话并从8443 URL 获得响应时没有问题。一旦我尝试在 PHP 中使用它制作soapclient,它就不喜欢它
    • 有人在此处将此行为作为错误发布:bugs.php.net/bug.php?id=30359 这是你吗?如果它在 8443 上为您使用 soapUI,它可能是一个 PHP 错误。可以肯定的是,您必须分析网络流量(参见 DaveRandom 对 Wireshark 的评论)。
    • 不,那不是我。我现在看看wireshark。谢谢
    【解决方案3】:

    “Function ("FalseMethod") is not a valid method for this service”错误仅由 WSDL 检查引起。 PHP 成功下载了 WSDL,但无法访问其中的 Web 服务。

    您必须将 trace 设置为 1 来调试 Soap 调用:

    $client = SoapClient("some.wsdl", array('trace' => 1));
    $result = $client->SomeFunction();
    echo "REQUEST:\n" . $client->__getLastRequest() . "\n";
    echo "REQUEST HEADERS:\n" . $client->__getLastRequestHeaders() . "\n";
    echo "RESPONSE HEADERS:\n" . $client->__getLastResponseHeaders() . "\n";
    echo "Response:\n" . $client->__getLastResponse() . "\n";
    

    另外,请查看 Wsdl 中的 URL 集。

    【讨论】:

    【解决方案4】:

    我接受了 DerVO 的回答,因为他的指点帮助我解决了这个问题。端口号并没有完全导致问题,但我觉得可能以某种方式促成了它。

    在soap UI中加载WSDL时,它显示简单和复杂的对象类型没有问题,但是在PHP中这导致它崩溃,即WSDL定义了一组“

    理查德

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      相关资源
      最近更新 更多