web-dev-qa-db-fra.com

Exception SoapFault: impossible de se connecter à l'hôte

Parfois, ne pas appeler le service Web.

Ce problème se produit tout le temps.

Quel pourrait être le problème?

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

Le problème a été résolu.Le problème est le cache

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

J'ajoute mon commentaire pour être complet, car les solutions énumérées ici ne m'ont pas aidé. Sur PHP 5.6, SoapClient effectue le premier appel à l'URL WSDL spécifiée dans SoapClient::SoapClient et après s'y être connecté et avoir reçu le résultat, il essaie de se connecter au WSDL spécifié dans le résultat dans:

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

Et l'appel échoue avec l'erreur Could not connect to Host si le WSDL est différent de celui que vous avez spécifié dans SoapClient::SoapClient et est inaccessible (mon cas était SoapUI utilisant http: //Host.local/ ).

Le comportement dans PHP 5.4 est différent et il utilise toujours le WSDL dans SoapClient::SoapClient.

20
VolenD

L'hôte est en panne ou très lent à répondre. S'il est lent à répondre, vous pouvez essayer d'augmenter le délai d'expiration via le connection_timeout option ou via default_socket_timeout paramètre et voir si cela réduit les échecs.

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

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

Vous pouvez également inclure la gestion des erreurs comme l'a souligné zanlok pour réessayer plusieurs fois. Si des utilisateurs attendent réellement ces appels SOAP, alors vous voudrez les mettre en file d'attente et les traiter en arrière-plan et avertir l'utilisateur lorsqu'ils ont terminé.

13
Rob Olmos

il y a une section de configuration de savon dans votre fichier php.ini, qui contrôle le cache d'accès wsdl, peut être affichée comme:

[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

si le cache de fichiers wsdl est activé, cela peut provoquer ce problème lors de la modification de l'URI wsdl dans le code php. dans cet exemple, vous pouvez simplement supprimer le début du fichier avec wsdl- en dessous de /tmp répertoire. ou vous définissez simplement soap.wsdl_cache_enabled=0; et soap.wsdl_cache_ttl=0; PHP récupérera le fichier wsdl à chaque fois que vous visitez la page.

8
curzduff

Un service mal configuré quitte l'espace de noms par défaut avec tempuri.org

Cela signifie que la connexion au wsdl fonctionnera, mais l'appel de fonction échouera.

Trace de la pile:

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

Pour y remédier, vous devez définir explicitement l'emplacement à l'aide de __setLocation()

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

Dans mon cas, cela a fonctionné après la connexion au wsdl, utilisez la fonction __setLocation() pour définir à nouveau l'emplacement car l'appel échoue avec l'erreur:

Impossible de se connecter à l'hôte

Cela se produit si le WSDL est différent de celui spécifié dans SoapClient::SoapClient.

4

J'ai moi-même rencontré ce problème et après avoir beaucoup creusé, j'ai finalement trouvé ce bogue pour ubuntu:

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

plus précisément

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

openssl s_client -connect site.tld:443 a échoué cependant openssl s_client -tls1 -connect site.tld:443 a réussi. Dans mon cas particulier, une partie de la sortie comprenait New, TLSv1/SSLv3, Cipher is RC4-MD5 j'ai donc défini la valeur ssl/cipher du contexte php de manière appropriée.

4
Travis Hansen

Dans notre cas, c'était un problème de négociation Ciphers. Nous obtenions cette erreur au hasard. Nous avons résolu notre problème en forçant un chiffrement comme celui-ci:

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

On dirait que PHP ne négociait pas les mêmes chiffres à chaque appel de service.

3
MaxP

Ce travail pour moi

$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)
  ));
3

Il semble que l'erreur SoapFault exception: Could not connect to Host peut être causé par plusieurs choses différentes. Dans mon cas, cela n'a pas été causé par un proxy, un pare-feu ou un DNS (j'avais en fait une connexion SOAP de la même machine fonctionnant avec nusoap sans aucune configuration spéciale).

Enfin, j'ai trouvé que cela était dû à un fichier pem invalide auquel j'ai fait référence dans le local_cert option dans mon constructeur SoapClient.

Solution: Lorsque j'ai supprimé la chaîne de certificats du fichier pem, elle uniquement contenait un certificat et une clé privée, les appels SOAP ont commencé à passer.

3
Jacob

J'ai finalement trouvé la raison - sa raison pour laquelle la bibliothèque ne trouve pas de bundle CA sur votre système. PHP> = v5.6 définit automatiquement verify_peer sur true par défaut. Cependant, tous les systèmes n'ont pas de bundle CA connu sur le disque.

Vous pouvez essayer l'une de ces procédures:

1.Si vous avez un fichier CA sur votre système, définissez openssl.cafile ou curl.cainfo dans votre php.ini au chemin de votre fichier CA.

2. Spécifiez manuellement l'emplacement de votre fichier SSL CA

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

3. désactivé verify_peer

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

Si vous avez un pare-feu sur votre serveur, assurez-vous d'ouvrir le port utilisé par SOAP.

Dans mon cas, j'ai dû ouvrir le port 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

Dans mon cas, l'adresse de service dans wsdl est incorrecte.

Mon URL WSDL est.

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

Mais l'adresse de service dans ce résultat xml est.

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

Je viens d'enregistrer ce xml dans un fichier local et de changer l'adresse du service en.

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

Bonne chance.

1
Panusit

Avec moi, ce problème dans l'adresse de base dans app.config du service WCF: Quand j'ai utilisé:

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

c'est ok si vous utilisez .net pour vous connecter avec une adresse IP ou un domaine public.

Mais lorsque vous utilisez SoapClient de PHP pour vous connecter à "http://[online ip]:9022/Service/GatewayService ", il s'agit de l'exception de lancement" Coulod ne se connecte pas à l'hôte "

J'ai changé baseAddress en [IP en ligne]: 9022 et tout va bien.

1
Nesaver

Pour moi, c'était un problème DNS. Les serveurs de noms de mon VPS ont craqué, alors je suis passé à Google en modifiant mon /etc/resolv.conf pour: nameserver 8.8.8.8 nameserver 8.8.4.4

1
David Hadaller

si la solution d'ujava ne peut pas vous aider, vous pouvez essayer d'utiliser try/catch pour attraper ce fatal, cela me convient.

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

Pour ceux qui ont lutté comme moi avec la commande laravel artisan console qui fait beaucoup de demandes au même wsdl du serveur de savon externe, puis après un certain temps échoue avec Could not connect to Host Erreur.

Le problème était dû au fait que je créais une nouvelle instance de SoapClient à chaque fois avant la demande. Ne faites pas cela. Créez-le une fois et faites chaque demande auprès du même client.

J'espère que ça aide.

1
Nick Synev

Juste pour aider les autres personnes qui rencontrent cette erreur, l'URL dans <soap:address location="https://some.url"/> avait un certificat non valide et a provoqué l'erreur.

0
Cas van Noort

Si la connexion se fait via SSL, cela pourrait être un problème de serveur au lieu de client (c'est mon cas).

Dans PHP versions supérieures à 5.6 et 7, il est important de vérifier la CipherSuite utilisée dans le certificat de serveur. Il y a une liste complète des chiffrements autorisés par ces versions et une liste complète des chiffrements qui ne le font pas dans ce lien web: https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_Ciphersuite

Si le chiffrement utilisé n'est pas autorisé (il s'agit d'un algorithme obsolète), SoapClient reçoit "Impossible de se connecter à l'hôte" et il n'y a plus de trace à ce sujet.

Le chiffrement utilisé peut être vérifié par des clients comme SoapUI dans la section "SSL Info", par exemple.

Il n'y a pas de forum de discussion traitant de cela sur Internet.

Vérifiez également ceci: http://php.net/manual/en/migration56.openssl.php

0
Zelkovar

Pour moi, c'était un problème dans le service httpd (Fedora 24). Un simple redémarrage a fait l'affaire:

Sudo service httpd restart
0
hlscalon

Pour moi, c'était un problème de certificat. La suite a fonctionné pour moi

$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

J'ai eu une mauvaise configuration de php.ini. Vérifiez le chemin et la validité du certificat ...

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

Parce que mon nouveau\SoapClient ($ wsdl) était https!

0
François Breton