web-dev-qa-db-ja.com

SoapFault例外:ホストに接続できませんでした

Webサービスの呼び出しに失敗する場合があります。

この問題は常に発生します。

何が問題なのでしょうか?

Error:
    SoapFault exception: [HTTP] Could not connect to Host in 
    0 [internal function]: SoapClient->__doRequest('<?xml version="...', http://.', '', 1, 0)
28
ujava

問題は解決されました。問題はキャッシュです

ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);
28
ujava

ここに挙げた解決策は役に立たなかったため、完全性のためにコメントを追加しています。 PHP 5.6、SoapClientはSoapClient::SoapClientで指定されたWSDL URLに最初の呼び出しを行い、それに接続して結果を受信した後、結果で指定されたWSDLに接続しようとしますに:

<soap:address location="http://"/>

また、WSDLがCould not connect to Hostで指定したものと異なり、到達不能である場合、呼び出しはエラーSoapClient::SoapClientで失敗します(私の場合は http://Host.local/ を使用するSoapUIでした) =)。

PHP 5.4)の動作は異なり、SoapClient::SoapClientのWSDLを常に使用します。

20
VolenD

ホストがダウンしているか、応答が非常に遅い。応答が遅い場合は、connection_timeoutオプションまたはdefault_socket_timeout設定を使用してタイムアウトを増やしてみて、失敗が減少するかどうかを確認できます。

http://www.php.net/manual/en/soapclient.soapclient.php

http://www.php.net/manual/en/filesystem.configuration.php#ini.default-socket-timeout

Zanlokが数回再試行するように指摘したときに、エラー処理を含めることもできます。これらのSOAP呼び出しで実際に待機しているユーザーがいる場合、それらをキューに入れてバックグラウンドで処理し、終了したらユーザーに通知します。

13
Rob Olmos

php.iniファイルには、wsdlアクセスキャッシュを制御するsoap configセクションがあり、次のように表示されます。

[soap] 
; Enables or disables WSDL caching feature. 
soap.wsdl_cache_enabled=1 ; 
Sets the directory name where SOAP extension will put cache files. 
soap.wsdl_cache_dir="/tmp" 
; (time to live) Sets the number of second while cached file will be used ; instead of original one.  
soap.wsdl_cache_ttl=86400

wsdlファイルキャッシュが有効になっている場合、phpコードでwsdl URIを変更すると、この問題が発生する可能性があります。この例では、wsdl-ディレクトリの下の/tmpで始まるファイルを削除できます。または、soap.wsdl_cache_enabled=0;およびsoap.wsdl_cache_ttl=0; PHPを設定すると、ページにアクセスするたびにwsdlファイルが取得されます。

8
curzduff

misconfigured サービスは、tempuri.orgでデフォルトのネームスペースを残します

つまり、wsdlへの接続は機能しますが、関数呼び出しは失敗します。

スタックトレース:

SoapClient-> __doRequest( 'http://example.com ...'、 ' http://tempuri.org ....'、2、0)

これを修正するには、__setLocation()を使用して場所を明示的に設定する必要があります

$this->soapClient = new \SoapClient(WS_URL);
$this->soapClient->__setLocation(WS_URL);
6
MediaFormat

私の場合、wsdlへの接続後に機能しました。関数__setLocation()を使用して、呼び出しがエラーで失敗するため、場所を再度定義します。

ホストに接続できませんでした

これは、WSDLがSoapClient::SoapClientで指定されたものと異なる場合に発生します。

4

私は自分でこの問題にぶつかり、掘り下げた後、最終的にubuntuのバグを見つけました。

https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/965371

具体的に

https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/965371/comments/62

openssl s_client -connect site.tld:443失敗しましたopenssl s_client -tls1 -connect site.tld:443は成功しました。私の特定のケースでは、出力の一部にNew, TLSv1/SSLv3, Cipher is RC4-MD5だから、php context ssl/cipher値を適切に設定しました。

4
Travis Hansen

私たちのケースでは、暗号のネゴシエーションの問題でした。このエラーはランダムに発生していました。次のような暗号を強制することで問題を解決しました。

$soapClient = new SoapClient('http://example.com/soap.asmx?wsdl',array("stream_context" => stream_context_create(array('ssl' => array('ciphers'=>'AES256-SHA')))));

PHPは各サービス呼び出しで同じ暗号をネゴシエートしていませんでした。

3
MaxP

私のためのこの仕事

$opts = array(
  'ssl' => array('verify_peer' => false, 'verify_peer_name' => false)
);

if (!isset($this->soap_client)) {
  $this->soap_client = new SoapClient($this->WSDL, array(
    'soap_version'   => $this->soap_version,
    'location'       => $this->URL,
    'trace'          => 1,
    'exceptions'     => 0,
    'stream_context' => stream_context_create($opts)
  ));

エラーSoapFault exception: Could not connect to Hostはいくつかの異なる原因で発生する可能性があるようです。私の場合、それはプロキシ、ファイアウォール、またはDNSによるものではありません(実際には、特別な設定なしで nusoap を使用して動作する同じマシンからのSOAP接続がありました)。

最後に、SoapClientコンストラクターのlocal_certオプションで参照した無効なpemファイルが原因であることがわかりました。

解決策:pemファイルから証明書チェーンを削除したとき、only証明書と秘密キーが含まれ、SOAP呼び出しが開始されました。

3
Jacob

私はついにその理由を見つけました。そのライブラリがシステム上にCAバンドルを見つけられないためです。 PHP> = v5.6は自動的にverify_peerをデフォルトでtrueに設定します。ただし、すべてのシステムがディスク上に既知のCAバンドルを持っているわけではありません。

次の手順のいずれかを試すことができます。

1.システムにCAファイルがある場合は、openssl.cafileまたはcurl.cainfoあなたのphp.iniはCAファイルのパスです。

2.SSL CAファイルの場所を手動で指定する

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);  
curl_setopt($cHandler, CURLOPT_CAINFO, $path-of-your-ca-file);

3.verify_peerを無効化

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
2
Tianya Lan

サーバーにファイアウォールがある場合は、SOAPが使用するポートを開いてください。

私の場合、ポート1664を開く必要がありました。

iptables -t filter -A INPUT -p tcp --dport 1664 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 1664 -j ACCEPT
1
Nicolas BADIA

私の場合、wsdlのサービスアドレスが間違っています。

私のWSDLのURLは。

https://myweb.com:4460/xxx_webservices/services/ABC.ABC?wsdl

しかし、そのxml結果のサービスアドレスはそうです。

<soap:address location="http://myweb.com:8080/xxx_webservices/services/ABC.ABC/"/>

そのxmlをローカルファイルに保存し、サービスアドレスを変更します。

<soap:address location="https://myweb.com:4460/xxx_webservices/services/ABC.ABC/"/>

がんばろう。

1
Panusit

私と一緒に、WCFサービスのapp.configのベースアドレスのこの問題:私が使用したとき:

<baseAddresses><add baseAddress="http://127.0.0.1:9022/Service/GatewayService"/> </baseAddresses>

.netを使用してパブリックIPまたはドメインに接続する場合は問題ありません。

ただし、PHPのSoapClientを使用して「http://[online ip]:9022/Service/GatewayService "、例外「Coulod not host to host」がスローされます

BaseAddressを[online ip]:9022に変更しましたが、すべて問題ありません。

1
Nesaver

私にとってはDNSの問題でした。私のVPSのネームサーバーが壊れたので、/ etc/resolv.confを編集してGoogleに切り替えました。nameserver8.8.8.8 nameserver 8.8.4.4

1
David Hadaller

ujavaのソリューションで解決できない場合は、try/catchを使用してこの致命的な問題をキャッチしてみてください。これはうまくいきます。

try{
    $res = $client->__call('LineStopQueryJson',array('Parameters' => $params));
}catch(SoapFault $e){
    print_r($client);
}
1
pan7an

laravel外部のSOAPサーバーの同じwsdlに多くのリクエストを送信し、しばらくしてCould not connect to Hostエラー。

問題は、リクエストが行われる前に毎回新しいSoapClientインスタンスを作成していたためです。そんなことしたらダメ。一度作成して、同じクライアントから各リクエストを作成します。

それが役に立てば幸い。

1
Nick Synev

このエラーが発生した他の人を助けるために、<soap:address location="https://some.url"/>に無効な証明書があり、エラーが発生しました。

0
Cas van Noort

接続がSSL経由の場合、クライアントではなくサーバーの問題である可能性があります(私の場合)。

PHPバージョン5.6および7以降は、サーバー証明書で使用されるCipherSuiteを確認するために重要です。このバージョンで許可されている暗号の完全なリストと、このWebリンク: https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_Ciphersuite

使用されている暗号が許可されていない(非推奨のアルゴリズムである)場合、SoapClientは「Could not connect to Host」を受け取り、それに関するトレースはこれ以上ありません。

使用される暗号は、たとえば「SSL情報」のセクションでSoapUIなどのクライアントによって確認できます。

インターネット上でこれについて扱っているスレッドフォーラムはありません。

これもチェックしてください: http://php.net/manual/en/migration56.openssl.php

0
Zelkovar

私にとって、これはhttpdサービスの問題でした(Fedora 24)。簡単な再起動でうまくいきました:

Sudo service httpd restart
0
hlscalon

私にとっては、証明書の問題でした。次は私のために働いた

$context = stream_context_create([
    'ssl' => [
        // set some SSL/TLS specific options
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    ]
]);

$client  = new SoapClient(null, [
    'location' => 'https://...',
    'uri' => '...', 
    'stream_context' => $context
]);
0
Jean Fiedler

Php.iniの設定が間違っていました。パスと証明書の有効性を確認してください...

[openssl]
openssl.cafile = "C:/good/phpath/ca-bundle.crt"

新しい\ SoapClient($ wsdl)がhttpsだったからです!

0