Sto provando a richiamare un servizio WCF (.NET) da PHP. È un po 'più complicato del semplice utilizzo di un SoapClient
poiché il servizio utilizza un WS2007FederationHttpBinding
per l'autenticazione.Invocazione del servizio WCF con PHP (con sicurezza federata)
Ecco il codice che sto utilizzando al momento. Non ho nemmeno aggiunto le credenziali perché non sono sicuro di come, ma a prescindere, non sono nemmeno al punto in cui ricevo errori di accesso negato.
$wsdl = "https://slc.centershift.com/sandbox40/StoreService.svc?wsdl";
$client = new SoapClient($wsdl,array(
//'soap_version'=>SOAP_1_2 // default 1.1, but this gives 'Uncaught SoapFault exception: [HTTP] Error Fetching http headers'
));
$params = array();
$params['SiteID'] = 123;
$params['GetPromoData'] = false;
$ret = $client->GetSiteUnitData(array('GetSiteUnitData_Request'=>$params));
print_r($ret);
Quale WSDL dovrei essere rivolto a?
https://slc.centershift.com/Sandbox40/StoreService.svc?wsdl
sembra essere molto breve, ma include un riferimento (nota lawsdl0
)https://slc.centershift.com/Sandbox40/StoreService.svc?wsdl=wsdl0
https://slc.centershift.com/Sandbox40/StoreService.svc?singleWsdl
sembra avere tutto in esso.
Devo specificare SOAP 1.2? Quando lo faccio, ottengo un timeout di connessione (
[HTTP] Error Fetching http headers
). Quando non lo faccio, viene utilizzato il default di SOAP 1.1 e ottengo un[HTTP] Cannot process the message because the content type 'text/xml; charset=utf-8' was not the expected type 'application/soap+xml; charset=utf-8'
. È perché non sono ancora autenticato, o perché sto usando la versione SOAP sbagliata?Come autenticarsi in PHP? Ecco il corrispondente codice .NET/C#. Devo in qualche modo mettere questi come intestazioni SOAP? O sto pensando a tutto sbagliato, e ho bisogno di fare un qualche tipo di autenticazione prima ancora di chiamare il metodo (da quello che ho letto, dovrei recuperare un token e poi usarlo per tutte le chiamate future al metodo - I sembra di vedere un esempio di questo in an answer here on Stack Overflow.
Se chiamo $client->__getFunctions()
, utilizzando WSDL e SOAP entrambe le versioni, sto diventando una lista valida di tutte le funzioni, quindi immagino che uno di questi è il mio vero problema è l'autenticazione
Altri programmatori con cui ho parlato hanno dedicato del tempo a cercare di farlo funzionare, ma hanno rinunciato e hanno implementato un proxy in .N ET. Passano i loro parametri da PHP al loro servizio .NET non protetto, che a sua volta chiama questo servizio sicuro. Funziona, ma mi sembra follemente inefficiente e controproducente, in quanto lo scopo di WCF è supportare tutti i tipi di client (anche quelli non-HTTP!).
Ho letto How to: Create a WSFederationHttpBinding su MSDN, ma non ha aiutato.
O? Wsdl o? SingleWsdl andrà bene. Il primo fa riferimento a più documenti suddivisi per scopo, il secondo ha tutto in un unico punto. Wsdl specifica la versione soap in uso, quindi sembra strano che dopo aver scaricato wsdl sia ancora necessario sapere quale versione di soap usare. Suggerirei che la libreria sia immaturo/di scarsa qualità se queste informazioni di base devono essere fornite in aggiunta al wsdl e non mi aspetto che la federazione funzioni con esso. Suggerisco di trovare una libreria di sapone diversa/migliore. – MattC
@MattC Grazie per il commento. Buono a sapersi sul WSDL, ma si spera che la soap library non sia un problema (è il PHP nativo). Ho controllato nuSoap, ma non sembrava offrire alcun vantaggio. –
Davvero non voglio sembrare snarky, @ShaneN, ma essere integrato in PHP non è una garanzia di qualità. Vedi per es. il crappy 'mail()'. Non ho lavorato con SOAP da PHP, quindi non posso aiutarti. – Palec