Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SOAP][PHP] SOAP-ERROR: Parsing WSDL:failed to load external

Pagina: 1
Acties:

  • Tsjilp
  • Registratie: November 2002
  • Niet online
Ik probeer met php een verbinding te maken met een SOAP webservice. De WSDL is via m'n browser gewoon op te vragen, en ook met file_get_contents krijg ik de WSDL gewoon binnen. Echter, als ik via
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$opts = array('http'=>array('user_agent' => 'PHPSoapClient'));
        $context = stream_context_create($opts);
        $options = array(
                            "trace" => true,
                            "exception" => 0,
                            'style' => SOAP_RPC,
                            'use' => SOAP_ENCODED,
                            "connection_timeout" => 15,
                            'stream_context' => $context,
                            'cache_wsdl' => WSDL_CACHE_NONE,
                            'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
                            "features" => SOAP_SINGLE_ELEMENT_ARRAYS);
        return $options;

$client = new \SoapClient($wsdl, $options);

De verbinding wil opzetten krijg ik PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'url naar webservice' : failed to load external entity "url naar webservice"

Op de productieomgeving is de webservice gewoon bereikbaar, maar zowel op mijn lokale machine als op de testserver is de webservice niet (altijd) bereikbaar.

Raar... Is zo gek nog niet


  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 21:29
Wat is de inhoud van de variabele $wsdl?

Onderstaande code levert namelijk jouw foutmelding op:
PHP:
1
$wsdl = "url naar webservice";

  • Tsjilp
  • Registratie: November 2002
  • Niet online
$wsdl bevat de url naar de webservice, omdat ik niet weet of deze publiek is deel ik die niet.

Raar... Is zo gek nog niet


  • Cartman!
  • Registratie: April 2000
  • Niet online
Klinkt als een IP-restrictie hoewel dat het "soms" niet verklaart. Probeer die wsdl eerst eens via gewoon te laden en kijk naar de headers die je terugkrijgt.

  • Tsjilp
  • Registratie: November 2002
  • Niet online
Als het een IP restrictie zou zijn, dan zou ik hem toch ook niet via m'n browser / curl moeten kunnen laden?
Anywho:

code:
1
2
3
4
5
6
7
8
HTTP/1.1 200 OK
Date: Fri, 25 Jul 2014 13:28:57 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 4.0.30319
Content-Length: 71608
Cache-Control: private
Content-Type: text/xml; charset=UTF-8


Nog wat wellicht relevante gegevens van m'n ontwikkelmachine:

PHP Version 5.5.9-1ubuntu4.3

soap.wsdl_cache:1
soap.wsdl_cache_dir: /tmp
soap.wsdl_cache_enabled: 1
soap.wsdl_cache_limit: 5
soap.wsdl_cache_ttl: 86400

Raar... Is zo gek nog niet


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Pas ook op voor https://bugs.php.net/bug.php?id=62577 en related issues.

libxml_disable_entity_loader() werkt namelijk ook niet netjes per hit, dus je kan niet eens uit gaan van je server settings. Ergo: In elk script waarin je affected functions gebruikt moet je zelf libxml_disable_entity_loader() aanroepen omdat je anders niet weet wat je aan het doen bent.

offtopic:
Obvious gevolg: Op het moment dat jij het altijd netjes aan roept beinvloed je ook de oude scriptjes van andere pakketten/collega's. Vote dus ook vooral op het fixen van deze php issues.

[ Voor 20% gewijzigd door Voutloos op 25-07-2014 16:00 ]

{signature}


  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 21:29
Wat ook nog zou kunnen is dat de WSDL op zich zelf weer andere WSDL include, namelijk met import. Dat zou je moeten kunnen zien in de XML van de WSDL. Zoiets dus:

code:
1
2
   <import namespace="http://example.com/stockquote/schemas"
           location="url naar webservice"/>

  • Tsjilp
  • Registratie: November 2002
  • Niet online
Hmm, die was ik nog niet tegen gekomen. Voor de zekerheid libxml_disable_entity_loader voor het aanmaken van de soapclient toegevoegd. Echter verklaard dit ook niet waarom een call soms wel en soms niet werkt.

Er worden geen namespaces geimporteerd

[ Voor 9% gewijzigd door Tsjilp op 25-07-2014 16:21 ]

Raar... Is zo gek nog niet


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Tsjilp schreef op vrijdag 25 juli 2014 @ 16:21:
Echter verklaard dit ook niet waarom een call soms wel en soms niet werkt.
Jawel, die setting wordt per process aangepast, niet per hit. Dus het is maar net welk scriptje vlak voor je zat. :X :X :r |:(

Vandaar dus het advies dat je het altijd moet instellen, want je weet anders echt niet wat de staat is.

{signature}


  • Onoffon
  • Registratie: April 2006
  • Laatst online: 21-11 10:56
Is het een http of https verbinding? Volgens mij moet je bij https nog het client certificaat aan de SOAP functie meegeven.

En het endpoint hoeft niet perse dezelfde link als de WSDL te zijn. Probeer eens te laden vanaf een lokale WSDL. Welke melding krijg je dan?


Sorry, ik zie nu pas soms wel, soms niet. Dan inderdaad of netwerk hick-ups of de inhoud van het bericht (UTF-8 encoding, etc)? Maar lijkt me niet dat het laatste deze fout melding geeft, maar met PHP weet je het maar nooit.

[ Voor 67% gewijzigd door Onoffon op 27-07-2014 00:18 ]

Just a simple thought....

Pagina: 1