2009-07-27 14 views
8

Ho un servizio Web WCF che consente sia client Basic HTTP che WS-HTTP, sia tramite HTTPS che utilizzando l'autenticazione della password nome utente &. Questo risultato è ottenuto con due associazioni sullo stesso servizio.Utilizzo di PHP per chiamare un servizio Web WCF con più associazioni

Così, il servizio è a https://foo.com/Service.svc, l'HTTP di base (SOAP 1.1) endpoint è https://foo.com/Service.svc/Unp11, e WS-HTTP (SOAP 1.2) endpoint è https://foo.com/Service.svc/Unp.

Un client sta tentando di accedere a questo servizio Web tramite PHP 5, utilizzando il supporto SOAP integrato e ha difficoltà a connettersi al servizio. Continua a ricevere una risposta HTTP 400 (Richiesta non valida), che tende a verificarsi se il messaggio SOAP è mal formato o se viene inviato un messaggio SOAP 1.1 a un endpoint SOAP 1.2 (o viceversa).

Conosco solo PHP di base, quindi ho problemi ad aiutarlo. So che puoi creare un cliente eseguendo

$client = new SoapClient('https://foo.com/Service.svc?wsdl'); 

ma come si specifica il binding/endpoint? Ci sono problemi noti per ottenere tutto questo con PHP?

UPDATE

Ok, in modo da poter utilizzare PHP per la connessione al servizio WCF ok (specificando la versione SOAP nel costruttore SoapClient), e chiamando $client->__getFunctions() restituisce un elenco corretto di tutte le operazioni di servizio web.

quando provo a chiamare uno utilizzando $client->__soapCall, la pagina appena ci si siede si carica per un bel po ', e alla fine restituisce l'errore "errore durante il recupero http header". Che cosa esattamente dovrebbe significare e come lo risolvo? (Consumare il servizio dal client .Net funziona perfettamente.)

risposta

5

Oggi ci siamo imbattuti in questo, creando un WCF con più associazioni per un chiamante PHP. L'impostazione della posizione sembra consentire sia la versione WSDL di PHP SoapClient che l'indicazione di un'associazione da utilizzare.

WCF config è (1 servizio con 2 collegamenti wsHttp e basicHttp), piuttosto diretto.

codice PHP:

$client = new SoapClient("http://example.com/service.svc?wsdl"); 
$client->__setLocation("http://example.com/service.svc/basic"); 
$response = $client->MethodName(array("paramName" => "paramValue" ...)); 
1

Abbiamo un servizio SOAP che ha più associazioni. In C# quando aggiungi un riferimento a un servizio wsdl ottieni una classe creata per ognuno, ma in PHP sembra che non puoi specificare quale legame vuoi usare - questo mi ha causato problemi quando i binding hanno tipo/metodo in conflitto nomi. Sembrerebbe generalmente funzionare bene, ma non so davvero come si sta affrontando internamente.

L'altro problema comune che ho riscontrato è che devo sempre racchiudere i parametri in carichi di matrici o di strutture - a volte si ottiene una richiesta non valida se il server si aspetta un parametro e non lo si è abbastanza impostato correttamente. (vedi Having trouble getting my head around SOAP in PHP)

Non sono sicuro che questo sia di grande aiuto, solo alcuni pensieri. Ci sono anche alcune implementazioni del client Soap di terze parti scritte in PHP che potrebbero valere la pena, ma saranno molto più lente.

+0

Grazie, questo è stato utile.Ora quando chiamo una delle operazioni del servizio, lo script non sembra tornare! Ho aggiunto alcuni dettagli alla domanda originale. –

+0

Oops, non ho aspettato abbastanza. "Errore durante il recupero degli header http" apparentemente ...? –

Problemi correlati