soap-error encoding object hasn't property

He elaborado un webservice en c# y el consumidor estaría en php con nusoap.
El webservice es el sgte:

[WebMethod(Description = "Registra Celular,IdServicio ( 130 ) ,Idoperadora,Operacion ( 1 Agregar 2 Borrar) ")]
public int registrosus(string Celular, int IdServicio, int Idoperadora,int Operacion)
{ int retorno=0;

string sqlinsert = "insert into registrotemporal(celular,idservicio,idoperadora,operacion) values('" + Celular + "'," + IdServicio + "," + Idoperadora + "," + Operacion + ")";
if (ocon1 == null || ocon1.State == ConnectionState.Closed)
ocon1.Open();
SqlCommand cmd2 = new SqlCommand(sqlinsert, ocon1);
retorno = cmd2.ExecuteNonQuery();
return retorno;
}


El código php que consume es este:


$servicio="http://192.168.233.12:8081/internas/Service1.asmx?WSDL";
$parametros=array();
$parametros['Celular']="595982440xxx";
$parametros['IdServicio']=130;
$parametros['IdOperadora']=1;
$parametros['Operacion']=2;
$client = new SoapClient($servicio, $parametros);
$result = $client->registrosus($parametros);//llamamos
$tmp = $result->registrosusResult;

?>

Al tratar de ejecutar este php desde la linea de comando del linux SSH :
# php /path/cliente.php
donde cliente php es el programa php de arriba y path es el camino a tu programa cliente.php.

Me salia un error :
PHP Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: o bject hasn't 'IdOperadora' property in /var/www/html/serviciosSMS/webservices/cliente.php:10

Cambie en el php IdOperadora por Idoperadora y me funciono. Es decir que importa la mayúscula o sino te da el error ese.

Viceversa también daba el error, me explico
Al tratar de actualizar mi webservice ( hecho en C#) de un parametro que estaba en minuscula
tipo Idoperadora a IdOperadora y luego ejecutar desde linea de comando # php /path/cliente.php me salia el error de SoapFault nuevamente . Acá por lo visto el apache cache el wsdl y no tomo mas mi actualización que hice en el webservice. Porque la llamada en el php y el webservice estaban correctas, respetando las mayúsculas y minúsculas de los parámetros.

Así que busque como no cachear ese wsdl del webservice y lo encontré haciendo así:
Lo primero que debemos modificar es el php.ini
( el php.ini esta localizado en /etc/php.ini)
soap.wsdl_cache_ttl = “86400″ es el default y es el numero de segundos en un dia, es decir cachea por un dia. No quiero esperar un dia asi que colocamos a 0.
colocar
soap.wsdl_cache_ttl = “0″
con esto desabilitaremos la cache del soap luego es reiniciar el apache , para que los cambios surjan efecto
Reiniciar el apache se hace asi
/usr/sbin/apachectl graceful

Con esto ejecutando ya podemos ejecutar nuestro php para estirar la nueva estructura wsdl
Saludos
Adalberto Montanía










Comentarios