2010-10-20 26 views
5

Soy nuevo en SOAP y trato con un servicio web donde parece que nadie se ha conectado previamente usando PHP. No tienen código de ejemplo excepto C# pero yo sí tengo eso. eServices.asmx proporciona WSDL si esa es la forma correcta de decir eso.Depurar llamada SOAP de PHP

El error que estoy recibiendo es "El servidor no reconoció el valor de la SOAPAction del Encabezado HTTP", con ese punto de entrenamiento que sugiere que no se pasa ningún valor, tal vez.

Mi código es el siguiente:

$URL = "http://nolaflash.example.com/xxxWS/eServices.asmx"; 

$namespace="http://www.example.com/webservices/"; 

include("SOAP/Client.php"); 

$soapclient = new SOAP_Client($URL); 

$xml_data = // valid XML is here; 

$res = $soapclient->UpdateData('usrname','pass',$xml_data); 

pero también he intentado:

$param = array('usrname','pass',$xml_data); 
$res = $soapclient->call('UpdateData',$param, $namespace); 

googlear sugiere que este error es un problema de espacio de nombres. El código C# Tengo sólo tiene un espacio de nombres de referencia:

[System.Web.Services.WebServiceBindingAttribute(Name="eServicesSoap", Namespace="http://www.example.com/webservices/")] 

Si yo tiro $ SoapClient a la pantalla antes de la llamada a la función veo que ha recibido datos de eServices.asmx.

No estoy seguro de cómo solucionar este problema y los miembros del personal del servicio no están familiarizados con la interacción con el servicio fuera de .NET IDE.

¿Alguna idea? ¿Consejo?

Respuesta

8

Normalmente uso los métodos getFunctions y getLastRequest para ayudarme a solucionar las cosas. Primero miro la lista de funciones y WSDL. En ocasiones, el WSDL y/o el servidor no se configuran/configuran/codifican correctamente. Entonces esta lista de funciones puede ser inútil. El archivo WSDL debe ser definitivo, pero desafortunadamente codificadores cojos, etc.

De modo que a veces tengo que apuñalar en la oscuridad, mirar el error y luego mirar la última solicitud. Con esto puedes ver el XML real que se produjo. Compare eso con algunos ejemplos XML que funcionan.

Esto ha demostrado ser más útil cuando se trata de codificadores que no desean escribir documentos. Por cierto, deberían dar ejemplos de XML, no mostrar cómo generar XML usando el lenguaje XYZ. Puede haber más informaciones útiles en the PHP/Soap documentation

HTH

+0

Gracias por los Sims respuesta! Cuando llamo al $ funcs = $ soapclient -> __ getFunctions(); print_r ($ funcs); Me sale el mismo error? SOAP_Fault objeto ( [error_message_prefix] => [mode] => 1 [nivel] => 1024 [code] => jabón: Cliente [mensaje] => Servidor no reconoció el valor de HTTP Encabezado SOAPAction:. [userinfo] => – jerrygarciuh

+0

OK, bueno, entonces el problema es más profundo y es más probable que sea un problema de configuración ... Una búsqueda encontró algunas cosas sobre espacios de nombres XML: http: //bluebones.net/2003/ 07/server-did-not-recognize-http-header-soapaction/ –

+0

BTW, ¿está usando un archivo WSDL/URL? –

0

para fines de depuración puede utilizar Fiddler debuger web. Lo encontré bastante útil. En estos días estoy trabajando en un proyecto basado en servicios web .net, y tengo que consumirlos a través de PHP. Este es un código de trabajo (y muy simple). Espero que esto le pueda ayudar. El propósito de este fragmento de código es verificar un estado en un registro específico.

Este es el WSDL

POST /b1synccontext.asmx HTTP/1.1 
Host: 00.00.00.0 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://tempuri.org/QueueEntryGetStatus" 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <QueueEntryGetStatus xmlns="http://tempuri.org/"> 
     <BuffID>int</BuffID> 
    </QueueEntryGetStatus> 
    </soap:Body> 
</soap:Envelope> 
HTTP/1.1 200 OK 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <QueueEntryGetStatusResponse xmlns="http://tempuri.org/"> 
     <QueueEntryGetStatusResult>int</QueueEntryGetStatusResult> 
    </QueueEntryGetStatusResponse> 
    </soap:Body> 
</soap:Envelope> 

Este es el código php

$client = new SoapClient("http://YOURIP/yourservice.asmx?wsdl",array(
         'exceptions'=>true, 
         'cache_wsdl'=>WSDL_CACHE_NONE, 
         'encoding'=>'utf-8')); 
$params = array(
    'BuffID' => 134 
    ); 

try 
    { 
     $result = $client->QueueEntryGetStatus($params); 
     $status = $result->QueueEntryGetStatusResult; 
     /*do something*/ 
    } 
    catch (Exception $e) 
    { 
     $e -> getMessage(); 
     /*do something*/ 
    }