PHP Soap Fault“无法连接到主机”

时间:2015-10-28 14:07:52

标签: php web-services soap soap-client

some questions in SO有同样的问题,但其中任何一个都对我有帮助。

以下是调用Soap Web服务的代码:

$client = new SoapClient($wsdl, array(
                               'soap_version' => SOAP_1_1,
                               'trace' => 1,
                               'exceptions'=> true,
                               'encoding' => 'UTF-8',
                               'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_DEFLATE,           
                               'cache_wsdl' => WSDL_CACHE_NONE
                                ))
$params = new SoapVar($xmlString, XSD_ANYXML, null, null);
try {
    $client->functionName($params);
catch (SoapFault $f) {
    print_r ($f);
}

这是(部分)SoapFault对象:

SoapFault Object
(
    [message:protected] => Could not connect to host
    [string:Exception:private] => 
    [code:protected] => 0
    [file:protected] => /home/user/Documentos/Web/Client.class.php //fileName
    [line:protected] => 49 //line where I have $client->functionName
    [trace:Exception:private] => Array
        (
            [0] => Array
                (
                    [function] => __doRequest
                    [class] => SoapClient
                    [type] => ->
                    [args] => Array
                        (
                            [0] => <?xml version="1.0" encoding="UTF-8"?> // the XML

                            [1] => https://example.company.com/WSDLName.svc //name of WSDL
                            [2] => http://example.org/Pull/functionName //URL with name of the function
                            [3] => 1
                            [4] => 0
                        )

                )

            [1] => Array
                (
                    [file] => /home/user/Documentos/Web/Client.class.php //fileName
                    [line] => 49
                    [function] => __call
                    [class] => SoapClient
                    [type] => ->
                    [args] => Array
                        (
                            [0] => functionName
                            [1] => Array
                                (
                                    [0] => SoapVar Object
                                        (
                                            [enc_type] => 147
                                            [enc_value] => //the XML
                                        )

                                )

                        )

                )

如果我拨打print_r($client->__getLastRequest());并在SoapUI中测试打印的XML,则所有内容都像魅力一样。

如果我打电话给print_r(file_get_contents($wsdl));我得到了WSDL文件。

尝试var_dump($client->__getLastRequestHeaders()),获取null;

我的尝试到现在为止:

1)在行ini_set('soap.wsdl_cache_enabled',0);之前放置$client = new SoapClient...。同样的错误。

2)将呼叫线路更改为$client->__soapCall('functionName',(array)$params)。同样的错误。唯一的区别是使用&lt;&#13;格式化的XML。

3)将我的肥皂选项改为array('soap_version' => SOAP_1_1,'trace' => 1)。同样的错误。

4)wsdl URL是一个http URL,所以我认为这不是SSL问题。但是,在SoapFault对象中,我使用https收到相同的网址,因此我将$ wsdl更改为使用https://的网址,并收到错误SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://example.company.com/WSDLName.svc?wsdl'

正如我所说,SoapUI中一切正常。

最后,这是我的服务器信息:

  

Ubuntu 14.04.3 LTS

     

Apache 2.4.7

     

PHP 5.5.9

有人知道我做错了吗?

更新

根据以下评论,以下是更多信息:

1)浏览器中的httphttps个URL都返回WSDL文档。

2)如果我在终端中ping wsdl URL,我会收到ping: unknown host https://example.org/Pull/functionName。 WSDL还有一个名为Ping的方法,定义为:

<wsdl:operation name="Ping">
<soap:operation soapAction="http://tempuri.org/IPull/Ping" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>

当我在PHP中使用它时,我得到了相同的场景:Soap Fault“无法连接到主机”,但是在SoapUI中创建的XML工作正常。

3)var_dump($client)的结果是:

object(SoapClient)[42]
  public 'trace' => int 1
  public 'compression' => int 32
  public '_encoding' => string 'UTF-8' (length=5)
  public '_soap_version' => int 1
  public 'sdl' => resource(30, Unknown)

注意 :我有一个解决方法来处理明确不是最佳选择的问题,但有效。 我使用DOMDocumentSimpleXML创建了整个XML正文(包含肥皂信封),然后通过cURL将其发送到网址https://example.company.com/WSDLName.svc。 这很难看,但在我等待任何其他解决方案的时候,我一直都在努力。

0 个答案:

没有答案