Error in deserializing body of reply message for operation

Este error del titulo nos daba al tratar de consumir un soap php en una aplicacion windows c#.Este soap php retorna un array.
Con mi compañero Juan Cuevas buscamos mucho en internet con algunas respuestas que decian que tendriamos que aumentar los valores en app.config del sistema C#. Los valores a aumentar eran maxBufferSize,maxBufferPoolSize,maxStringContentLength, etc. Aumenté todos estos valores, pero seguía dando el mismo error. "There is an error in XML document"

app.config

receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
maxBytesPerRead="4096" maxNameTableCharCount="16384" />

realm="" />





El codigo en php del soap es este



require_once '../nusoap/nusoap.php';
require_once 'enviarContenidoServDir.php';


function obtenerSMSRx($idServicio, $nroCelular, $smsGenerador) {



$return['smsRespuesta'] = "hola";
$return['cuponGenerado'] = 1;
$return['idTrivia'] = $a;

return $return;

}



$server = new nusoap_server();

$server->configureWSDL('SDLinuxtest','urn:'.$_SERVER['REQUEST_URI']);

$server->soap_defencoding = 'utf-8';

$server->wsdl->addComplexType(
'SMSRx',
'complexType',
'struct',
'all',
'',
array(
'smsRespuesta'=>array('name' => 'smsRespuesta', 'type' => 'xsd:string'),
'cuponGenerado'=>array('name' => 'cuponGenerado', 'type' => 'xsd:int'),
'idTrivia'=>array('name' => 'idTrivia', 'type' => 'xsd:int')
)
);


$server->register('obtenerSMSRx', // method name
array(
'idServicio'=>'xsd:int',
'nroCelular' => 'xsd:string',
'smsGenerador'=>'xsd:string'), // input parameters
array('return' => 'tns:SMSRx'), // output parameters
'urn:'.$_SERVER['REQUEST_URI'], // namespace
false,
'rpc', // style
'encoded', // use
'Genera SMS a enviar y cupones a asignar, en caso de trivia devuelve el idTrivia' // documentation

);

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);

exit;
?>
Lo primero que pensamos fue que el retorno de un array estaba causando el problema, al tratar de cambiar de tipo, pero no era así.
Buscando en internet me encontré con una solucion de c# consumiendo un soap php
http://www.hirdweb.com/2010/08/15/testing-the-nusoap-webservice/
Para los que no saben para tratar de consumir un soap en c# en solo agregar una referencia (Add Service Reference) , configurar el link en php que seria del tipo
http://XX.XX.XX.XX/serviciosSMS/webservices/ver.php?wsdl . Luego de eso es solo instanciar la clase y usar sus metodos que tiene en el programa.

Esta solución traía una estructura como nosotros hacíamos pero el nuestro no andaba. Probé su soap y me traía sus datos,por si alguien quiera probar acá está http://www.hirdweb.com/webservice/20100805_server.php?wsdl

Ahora menos entendía como el de él funcionaba y el de nosotros no. Así que comencé viendo su soap php y comparando cada valor con el de nosotros. Tocando cada valor y probando.
Hasta que me encontré con la sorpresa , que nosotros usamos 'urn:'.$_SERVER['REQUEST_URI'] en el configureWSDL y al registrar la funcion y el solo usaba un valor fijo.'urn:webservice' en ambos.
Con este cambio en soap php el error dejo de aparecer!!

También suponíamos que al devolver un valor null la funcion soap causaba el error pero esto no fue asi ya que c# convierte a 0 este valor.
Bueno le dejo esta solución por si a alguien le sirva.
Saludos
Adalberto Montania

Comentarios