2012-01-19 74 views
5

Estoy intentando escribir un script PHP que se conectará al cliente SOAP para nuestra interfaz SightMax. Con el código a continuación, puedo imprimir una lista de funciones disponibles; sin embargo, cuando intento llamar a cualquier función, obtengo el siguiente error.Error grave de PHP: "La acción SOAP especificada en el mensaje '' no coincide con la acción 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 

He estado investigando este error para el último par de días y he leído diferentes artículos que indican posibles problemas. Por lo que entiendo, este error se produce porque el cliente SOAP está configurado para wsHttpBinding y la compilación en el cliente SOAP para PHP no admite el wsHttpBinding o debo especificar específicamente la acción SOAP.

¿Alguien puede arrojar algo de luz sobre esto para mí? Tenga en cuenta que mientras soy versado en PHP, trabajar con SOAP es nuevo para mí, así que paso a paso son muy útiles.

Gracias de antemano.

+1

Hev you intenté omitir el parámetro de versión en 'nuevo SoapClient'? Soap 1.2 no usa el encabezado de acción SOAP, 1.1 lo hace. Es posible que el servidor solo entienda 1.1. –

+1

Cuando elimino el parámetro de versión SOAP_1_2 obtengo un error diferente Error fatal: excepción de SoapFault no capturada: [HTTP] No se puede procesar el mensaje porque el tipo de contenido 'text/xml; charset = utf-8 'no era el tipo esperado' application/soap + xml; charset = utf-8 '. en test2.php: 5 Stack trace: # 0 [función interna]: SoapClient -> __ doRequest ('__ call (' GetSiteSummary ', Array) # 2 {main} lanzado en/var/www/tools/html/whoseonchat/test2. php en la línea 5 –

Respuesta

1

Debe dar la Acción SOAP. Como no lo incluye en la inicialización de SoapClient, no coincide con la Acción SOAP del servicio web. Asegúrese de saber qué es la Acción SOAP antes de conectarse.

Lea http://www.oreillynet.com/xml/blog/2002/11/unraveling_the_mystery_of_soap.html para obtener más información sobre el tema.

+0

He leído el artículo y todavía no entiendo. ¿Cómo puedo indicar explícitamente la acción SOAP en mi script? –

+0

No lo sé, solo te dije que deberías saber qué la Acción SOAP debería ser. Lo siento. – Leonard

15

WCF parece estar buscando la acción en el sobre SOAP. Puede añadirlo a su llamada con SoapClient de PHP de esta manera:

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

Si cambia el tercer parámetro, y agrega que entre su instanciación de $ cliente y el __call() debe borrar el error (y posiblemente provocar otros nuevos, no es divertido jabón?)

también FYI, habiendo pasado por este mismo problema, me encontré con los __getLastRequestHeaders(), __getLastRequest(),() __getLastResponseHeaders y __getLastResponse() funciones muy útiles para ver si lo que estaba intentando tuvo algún efecto (tenga en cuenta que debe agregar "trace" => "1" a las opciones de SoapClient para que funcionen).

+2

Esto funciona genial Si no puede encontrar la Acción, está en el wsdl con el siguiente atributo:

+0

¡Gran respuesta! Muchas gracias. –

+0

Esta respuesta me salvó el día. Además, esta respuesta fue muy útil: http://stackoverflow.com/a/32641267/1795351 –