SOAP-ERROR: Parsing WSDL: Konnte nicht laden von – funktioniert aber auf WAMP

Lesezeit: 7 Minuten

Das funktioniert gut auf meinem WAMP-Server, aber nicht auf dem Linux-Master-Server!?

try{
    $client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true]);
    $result = $client->checkVat([
        'countryCode' => 'DK',
        'vatNumber' => '47458714'
    ]);
    print_r($result);
}
catch(Exception $e){
    echo $e->getMessage();
}

Was fehlt mir hier?! 🙁

SOAP ist aktiviert

Fehler

SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl' : failed to load external entity "http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"/taxation_customs/vies/checkVatService.wsdl"

Rufen Sie die URL aus PHP auf

Der Aufruf der URL aus PHP gibt einen Fehler zurück

$wsdl = file_get_contents('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl');
echo $wsdl;

Fehler

Warning:  file_get_contents(http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl): failed to open stream: HTTP request failed! HTTP/1.0 503 Service Unavailable

Rufen Sie die URL von der Befehlszeile aus auf

Aufrufen der URL von der Linux-Befehlszeile HTTP 200 wird mit einer XML-Antwort zurückgegeben

curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

  • Was macht curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl Sagen Sie, wenn Sie es auf der Shell auf dem Linux-Server ausführen?

    – ntaso

    20. Februar 2014 um 18:20 Uhr

  • HTTP 200 und XML ist die Antwort

    – Clark

    20. Februar 2014 um 19:10 Uhr

  • Klingt nach einem Problem mit der Zeichenkodierung. Ist das WDSL in dem Zeichensatz codiert, den der SOAP-Client erwartet?

    – GordonM

    11. Juli 2017 um 9:07 Uhr

SOAP ERROR Parsing WSDL Konnte nicht laden von funktioniert aber
Ivar

Bei einigen PHP-Versionen sendet der SoapClient keine HTTP-User-Agent-Informationen. Welche PHP-Versionen haben Sie auf dem Server im Vergleich zu Ihrem lokalen WAMP?

Versuchen Sie, den Benutzeragenten explizit festzulegen, indem Sie einen Kontextstream wie folgt verwenden:

try {
    $opts = array(
        'http' => array(
            'user_agent' => 'PHPSoapClient'
        )
    );
    $context = stream_context_create($opts);

    $wsdlUrl="http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl";
    $soapClientOptions = array(
        'stream_context' => $context,
        'cache_wsdl' => WSDL_CACHE_NONE
    );

    $client = new SoapClient($wsdlUrl, $soapClientOptions);

    $checkVatParameters = array(
        'countryCode' => 'DK',
        'vatNumber' => '47458714'
    );

    $result = $client->checkVat($checkVatParameters);
    print_r($result);
}
catch(Exception $e) {
    echo $e->getMessage();
}

Bearbeiten

Es scheint tatsächlich einige Probleme mit dem von Ihnen verwendeten Webdienst zu geben. Die Kombination aus HTTP über IPv6 und fehlender Zeichenfolge des HTTP-Benutzeragenten scheint dem Webdienst Probleme zu bereiten.

Um dies zu überprüfen, versuchen Sie Folgendes auf Ihrem Linux-Host:

curl  -A ''  -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

diese IPv6-Anforderung schlägt fehl.

curl  -A 'cURL User Agent'  -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

Diese IPv6-Anforderung ist erfolgreich.

curl  -A ''  -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
curl  -A 'cURL User Agent'  -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

Beide IPv4-Anforderungen sind erfolgreich.

Interessanter Fall 🙂 Ich vermute, dass Ihr Linux-Host ec.europa.eu in seine IPv6-Adresse auflöst und dass Ihre Version von SoapClient standardmäßig keinen User-Agent-String hinzugefügt hat.

  • Sie sagen, die IPv6-Anforderung schlägt fehl, geben aber nicht an, wie. Wenn es mit einem 503-Statuscode fehlschlägt, lösche ich meine Antwort. Wo ich bin, heißt es Failed to connect to 2001:bc8:3408:200::2: Network is unreachable

    – Walter Tross

    23. Februar 2014 um 21:48 Uhr

  • Das ist richtig, die Anfrage schlägt mit a fehl HTTP/1.0 503 Service Unavailable. Der Textkörper der 503-Antwort lautet Erreur 503 Erreur proxy ipv6.

    – Ivar

    24. Februar 2014 um 7:41 Uhr

  • Der Link zum gemeldeten SoapClient User Agent-Fehler bugs.php.net/bug.php?id=60887

    – Ivar

    24. Februar 2014 um 7:47 Uhr


  • OK, also habe ich in meiner Antwort nicht daran gedacht, IPv6 auszuprobieren. Du hast gewonnen. Ich werde meine Antwort löschen.

    – Walter Tross

    24. Februar 2014 um 7:59 Uhr

  • stream_context für https-URL: stackoverflow.com/a/28701786/2042775

    – sj59

    10. Oktober 2016 um 12:04 Uhr


Sicherheitsproblem: Diese Antwort deaktiviert Sicherheitsfunktionen und sollte nicht in der Produktion verwendet werden!

Versuche dies. Ich hoffe, es hilft

$options = [
    'cache_wsdl'     => WSDL_CACHE_NONE,
    'trace'          => 1,
    'stream_context' => stream_context_create(
        [
            'ssl' => [
                'verify_peer'       => false,
                'verify_peer_name'  => false,
                'allow_self_signed' => true
            ]
        ]
    )
];

$client = new SoapClient($url, $options);

Dieses Problem kann dadurch verursacht werden, dass der Entitätslader libxml deaktiviert wurde.

Versuchen Sie es mit Laufen libxml_disable_entity_loader(false); vor dem Instanziieren SoapClient.

  • Dies ist ein wirklich übler Fehler in PHP, der unter Linux zu einer Rennbedingung führen kann: bugs.launchpad.net/ubuntu/+source/php5/+bug/1160336

    – RyanNerd

    28. November 2017 um 19:54 Uhr

  • Diese Funktion ist veraltet!

    – Franz

    17. September 2021 um 14:43 Uhr

Es kann für jemanden hilfreich sein, obwohl es keine genaue Antwort auf diese Frage gibt.

Meine Seifen-URL hat einen nicht standardmäßigen Port (z. B. 9087), und die Firewall hat diese Anfrage blockiert, und ich habe jedes Mal diesen Fehler gemacht:

FEHLER – 2017-12-19 20:44:11 –> Schwerwiegender Fehler – SOAP-ERROR: Parsing WSDL: Konnte nicht geladen werden von ‘http://soalurl.test:9087/orawsv?wsdl‘ : Externe Entität konnte nicht geladen werden “http://soalurl.test:9087/orawsv?wsdl

Ich habe den Port in der Firewall zugelassen und den Fehler behoben!

1646311447 692 SOAP ERROR Parsing WSDL Konnte nicht laden von funktioniert aber
klugerama

Versuchen Sie, sich zu ändern

$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true]);

zu

$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true, 'cache_wsdl' => WSDL_CACHE_MEMORY]);

Überprüfen Sie auch (ob das funktioniert oder nicht), um sicherzustellen, dass dies der Fall ist /tmp von Ihrem Webserver beschreibbar ist und nicht voll ist.

  • @clarkk Kleinere Änderung (einfache Anführungszeichen hinzugefügt), sorry. Ist auch /tmp gut? Auch was bedeutet phpinfo() sage dir?

    – Weisheiterama

    21. Februar 2014 um 17:33 Uhr


  • Ein weiterer Gedanke: Könnte der Server auf https umleiten? Haben Sie Wireshark oder Fiddler für die Anfrage ausgeführt?

    – Weisheiterama

    21. Februar 2014 um 17:55 Uhr


  • Ich habe den Tippfehler mit einfachen Anführungszeichen gesehen 🙂 und es gibt keine Weiterleitung. Ich habe die Anfrage unter versucht www.web-sniffer.net

    – Clark

    21. Februar 2014 um 23:14 Uhr


  • Wie ich in meiner Frage geschrieben habe, kann ich die URL mit curl in der Befehlszeile aufrufen. Das muss eine Fehlkonfiguration in PHP sein … Auf dem alten Server mit Debian 6 und php5.3-etwas hat es funktioniert herum mit php.ini und es ist so ziemlich aus der Box

    – Clark

    21. Februar 2014 um 23:17 Uhr


Versuchen Sie, die openssl-Erweiterung in Ihrer php.ini zu aktivieren, wenn sie deaktiviert ist. Auf diese Weise konnte ich ohne zusätzliche Argumente auf den Webdienst zugreifen, dh

$client = new SoapClient(url);

  • @clarkk Kleinere Änderung (einfache Anführungszeichen hinzugefügt), sorry. Ist auch /tmp gut? Auch was bedeutet phpinfo() sage dir?

    – Weisheiterama

    21. Februar 2014 um 17:33 Uhr


  • Ein weiterer Gedanke: Könnte der Server auf https umleiten? Haben Sie Wireshark oder Fiddler für die Anfrage ausgeführt?

    – Weisheiterama

    21. Februar 2014 um 17:55 Uhr


  • Ich habe den Tippfehler mit einfachen Anführungszeichen gesehen 🙂 und es gibt keine Weiterleitung. Ich habe die Anfrage unter versucht www.web-sniffer.net

    – Clark

    21. Februar 2014 um 23:14 Uhr


  • Wie ich in meiner Frage geschrieben habe, kann ich die URL mit curl in der Befehlszeile aufrufen. Das muss eine Fehlkonfiguration in PHP sein … Auf dem alten Server mit Debian 6 und php5.3-etwas hat es funktioniert herum mit php.ini und es ist so ziemlich aus der Box

    – Clark

    21. Februar 2014 um 23:17 Uhr


Keines der oben genannten Dinge funktioniert für mich, also habe ich nach vielen Recherchen die wsdl-Datei vorab heruntergeladen, lokal gespeichert und diese Datei als ersten Parameter an SoapClient übergeben.

Erwähnenswert ist, dass file_get_contents($serviceUrl) eine leere Antwort für mich zurückgegeben hat, während die URL in meinem Browser einwandfrei geöffnet wurde. Das ist wahrscheinlich der Grund, warum SoapClient das wsdl-Dokument auch nicht laden konnte. Also habe ich es mit der PHP-Curl-Bibliothek heruntergeladen. Hier ist ein Beispiel

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $serviceUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$wsdl = curl_exec($ch);
curl_close($ch);

$wsdlFile="/tmp/service.wsdl";
file_put_contents($wsdlFile, $wsdl);

$client = new SoapClient($wsdlFile);

Sie können natürlich Ihre eigene Caching-Richtlinie für die wsdl-Datei implementieren, damit sie nicht bei jeder Anfrage heruntergeladen wird.

923500cookie-checkSOAP-ERROR: Parsing WSDL: Konnte nicht laden von – funktioniert aber auf WAMP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy