2016-06-13 6 views
1

Ich verbinde mich mit einem Drittanbieter-Dienst mit SoapClient. Die meiste Zeit es funktioniert gut, aber jeder einmal in eine Weile, vielleicht einmal aus jeden 100-150 Anrufe, erhalte ich die FehlerErhalten Sie schlechte WSDL von SoapFault?

Soap Failed: SOAP-ERROR: Parsing Schema: unexpected in complexType

Mein Code ist in einem try/catch mit einem erneuten Versuch, und es wird Arbeit an der nächsten Runde durch. Aber ich würde gerne die WSDL untersuchen, um herauszufinden, warum das scheitert, zum Teil für meine eigene Neugier, und für den Fall, dass ich es an die Firma weitergeben muss, mit der ich mich verbinde. Kann ich diese Informationen vom SoapFault erhalten? Oder müsste ich die URL aufrufen, um die Zeichenfolge zu erhalten? Ich fürchte, wenn ich die WSDL nach der Tat bekomme, kann es bereits behoben sein.

$pass = FALSE; 
$this->soap = NULL; 
$this->session = NULL; 
do { 
    try { 
     Doc::i("Starting session"); 
     $this->soap = new SoapClient($this->wsdl_url, ['trace' => 1]); 
     $pass = TRUE; 
    } catch (\SoapFault $e) { 
     Doc::e('Soap Failed: ' . $e->getMessage()); 
     if(str_contains($e->getMessage(),'Parsing Schema') && !empty($e->detail)) { 
      Doc::e($e->detail); // Something new I'm trying to see if it helps 
     } 
    } catch (FatalErrorException $e) { 
     Doc::e("Soap failed really bad: " . $e->getMessage()); 
    } catch (\Exception $e) { 
     Doc::e("Soap failed bad: " . $e->getMessage()); 
    } 
} while (!$pass); 
+0

['__getLastResponse'] (http://php.net/manual/de/soapclient.getlastresponse.php), da Sie' trace' verwenden? – bishop

+0

Ich habe '__getLastResponse()' gefunden, und habe das auch hinzugefügt. Ich hoffe, es klappt beim nächsten Mal, wenn ich den Fehler bekomme. Danke, dass du das unterstützt hast! – aynber

+0

Viel Glück! Diese Art von Fehlern sind ärgerlich. Ich habe eine offizielle Antwort geschrieben, falls das letztendlich klappt. – bishop

Antwort

0

sollten Sie in der Lage sein $this->soap->__getLastResponse() zu verwenden, da Sie 'trace' => 1 Option SoapClient sind vorbei.

Sie könnten auch die Protokollierung von $this->soap->__getLastRequest sowie die Header-Versionen von beiden erwägen, um sicherzustellen, dass Sie zur Laufzeit so viele Informationen wie möglich erfassen.

Die möglichen Optionen finden Sie in der Methodenliste SoapClient. Denken Sie daran, der Trick hier ist die trace Option: ohne dass diese nichts nützliches zurückgeben werden!

+0

Ich hoffte wirklich, dass dies funktionieren würde, aber stattdessen bekam ich 'Call to a member function __getLastResponse() auf einem Nicht-Objekt'. – aynber

+0

Hmm, das deutet darauf hin, dass der '\ SoapClient' nicht erstellt wird. Bitte aktualisieren Sie Ihr OP mit dem neuesten Code mit '__getLastResponse'. – bishop

+0

Wenn die PHP-Engine-Quelle läuft, scheint es, als ob [__doRequest] (https://github.com/php/php-src/blob/master/ext/soap/soap.c#L2585-L2586) fehlschlägt. Sie * können * in der Lage sein, Just-in-Time-Informationen zu sammeln, indem Sie Ihre eigene Client-Klasse erstellen und ['__doRequest'] (http://php.net/manual/en/soapclient.dorequest.php) wie in [] überschreiben. Dieses Beispiel] (https://github.com/php/php-src/blob/master/ext/soap/tests/typemap008.phpt#L9-L14). – bishop

Verwandte Themen