2009-07-27 24 views
8

Tengo un servicio web WCF que permite tanto clientes HTTP básicos como WS-HTTP, ambos a través de HTTPS con autenticación de contraseña de nombre de usuario &. Esto se logra con dos enlaces en el mismo servicio.Uso de PHP para llamar a un servicio web WCF con enlaces múltiples

Por lo tanto, el servicio está en https://foo.com/Service.svc, la básica HTTP (SOAP 1.1) punto final es https://foo.com/Service.svc/Unp11 y WS-HTTP (SOAP 1.2) punto final se https://foo.com/Service.svc/Unp.

Un cliente está intentando acceder a este servicio web a través de PHP 5, utilizando su soporte SOAP incorporado, y tiene problemas para conectarse al servicio. Continúa obteniendo una respuesta HTTP 400 (Solicitud incorrecta), que tiende a suceder si el mensaje SOAP está mal formado, o un mensaje SOAP 1.1 se envía a un punto final SOAP 1.2 (o viceversa).

Solo conozco PHP básico, así que estoy teniendo problemas para ayudarlo. Sé que usted puede crear un cliente haciendo

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

pero ¿cómo se especifica la unión/punto final? ¿Hay algún problema conocido que logre todo esto con PHP?

ACTUALIZACIÓN

Ok, así que puedo usar PHP para conectarse al servicio WCF bien (que especifica la versión de SOAP en el SoapClient constructor), y llamando $client->__getFunctions() devuelve una lista correcta de todas las operaciones de servicio web.

cuando trato de llamar a uno usando $client->__soapCall, la página sólo se sienta allí cargar durante bastante tiempo, y finalmente devuelve el error "error al recuperar las cabeceras http". ¿Qué se supone que significa esto exactamente y cómo lo soluciono? (El consumo del servicio del cliente .Net funciona perfectamente).

Respuesta

5

Acabo de toparme con esto hoy, creando un WCF con enlaces múltiples para un llamador de PHP. La configuración de la ubicación parece permitir tanto la versión WSDL del SoapClient de PHP como la especificación de un enlace para su uso.

WCF config es (1 servicio con 2 enlaces wsHttp y basicHttp), bastante directo.

código 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

Tenemos un servicio SOAP que tiene varias fijaciones. En C# cuando agrega una referencia de servicio a wsdl, obtiene una clase creada para cada uno, pero en PHP parece que no puede especificar qué enlace desea usar; esto me ha causado problemas cuando los enlaces tienen un tipo/método conflictivo nombres. En general, parece funcionar bien, pero realmente no sé cómo se trata internamente.

El otro problema común que he tenido es que siempre tengo que ajustar los parámetros en montones de matrices o estructuras: a veces se devuelve una solicitud incorrecta si el servidor espera un parámetro y no se ha configurado del todo correctamente. (Consulte Having trouble getting my head around SOAP in PHP)

No estoy seguro de que esto sea de mucha ayuda, solo algunas reflexiones. También hay algunas implementaciones de cliente de Soap de terceros escritas en PHP que podrían valer la pena mirar, pero serán bastante más lentas.

+0

Gracias, esto ha sido útil.Ahora cuando llamo a una de las operaciones del servicio, ¡parece que el script no regresa! He agregado algunos detalles a la pregunta original. –

+0

Vaya, no esperé lo suficiente. "Error al recuperar encabezados http" aparentemente ...? –

Cuestiones relacionadas