2012-01-19 2 views
5

Sto tentando di scrivere uno script PHP che si connetterà al client SOAP per l'interfaccia SightMax. Con il codice qui sotto sono in grado di stampare un elenco di funzioni disponibili, tuttavia quando provo a chiamare qualsiasi funzione sto ottenendo il seguente errore.Errore irreversibile PHP: "L'azione SOAP specificata nel messaggio, '', non corrisponde all'azione HTTP SOAP"

<?php 

$client = new SoapClient('http://domain.com/SightMaxWebServices/SightMaxWebService.svc?wsdl', array('soap_version' => SOAP_1_2)); 

var_dump($client->__getFunctions()); 

$result = $client->__call("GetSiteSummary", array()); 

echo "<pre>"; 
print_r($result); 
echo "</pre>"; 

?> 

Fatal error: Uncaught SoapFault exception: [s:Sender] The SOAP action specified on the message, '', does not match the HTTP SOAP Action, 'SmartMax.SightMax.Agent.Operator/IRemotedWebsiteAdministrator/GetSiteSummary'. in test2.php:7 Stack trace: #0 test2.php(7): SoapClient->__call('GetSiteSummary', Array) #1 {main} thrown in test2.php on line 7 

Sono stato alla ricerca di questo errore per gli ultimi due giorni e ho letto diversi articoli affermando possibili problemi. Da quello che ho capito, questo errore si verifica perché il client SOAP è configurato per wsHttpBinding e il build nel client SOAP per PHP non supporta wsHttpBinding o ho bisogno di specificare specificamente l'azione SOAP.

Qualcuno può far luce su questo per me? Si prega di tenere a mente mentre sono esperto di PHP che lavora con SOAP è nuovo per me, quindi passo dopo passo sono molto utili.

Grazie in anticipo.

+1

Hev you you provato a omettere il parametro version in 'new SoapClient'? Soap 1.2 non usa l'header azione SOAP, 1.1 lo fa. Potrebbe essere, che il server comprenda solo 1.1? –

+1

Quando rimuovo il parametro di versione SOAP_1_2, viene visualizzato un altro errore Errore irreversibile: eccezione SoapFault Uncaught: [HTTP] Impossibile elaborare il messaggio perché il tipo di contenuto "text/xml; charset = utf-8 'non era il tipo atteso' application/soap + xml; charset = utf-8' . in test2.php: 5 Traccia stack: # 0 [funzione interna]: SoapClient -> __ doRequest ('__ call (' GetSiteSummary ', Array) # 2 {main} generato in/var/www/tools/html/whichonchat/test2. php on line 5 –

risposta

1

È necessario fornire l'azione SOAP. Poiché non lo includi nell'inizializzazione di SoapClient, non corrisponde all'azione SOAP del servizio web. Assicurati di sapere cos'è l'azione SOAP prima di connetterti.

Leggi http://www.oreillynet.com/xml/blog/2002/11/unraveling_the_mystery_of_soap.html per ulteriori informazioni.

+0

Ho letto l'articolo e ancora non capisco Come posso dichiarare esplicitamente l'azione SOAP nel mio script? –

+0

Non lo so, ti ho appena detto che dovresti sapere cosa Mi dispiace, – Leonard

15

WCF sembra cercare l'azione nella busta SOAP. È possibile aggiungere alla vostra chiamata con SoapClient di PHP in questo modo:

$actionHeader = new SoapHeader('http://www.w3.org/2005/08/addressing', 
           'Action', 
           'http://soapaction.that.was.in.the.wsdl'); 
$client->__setSoapHeaders($actionHeader); 

Se si modifica il terzo parametro e aggiungere che tra l'istanza di $ cliente e la __call() dovrebbe eliminare l'errore (e possibilmente portare a quelli nuovi, non è divertente SOAP?)

Inoltre FYI, avendo appena passato attraverso questo stesso problema, ho trovato i __getLastRequestHeaders(), __getLastRequest(), __getLastResponseHeaders(), e __getLastResponse() funzioni molto utili per vedere se quello che stavo cercando ha avuto qualche effetto (si noti che è necessario aggiungere "trace" => "1" alle opzioni di SoapClient affinché funzionino.)

+2

Se non riesci a trovare l'azione, è nella wsdl con il seguente attributo:

+0

Ottima risposta! Grazie mille –

+0

Questa risposta mi ha salvato la giornata! Inoltre, questa risposta è stata molto utile: http://stackoverflow.com/a/32641267/1795351 –