Salve a tutti,
sono un principiante e sto cercando di creare un client di esempio in php (php 5.2.5 con estensioni soap abilitate) per due piccoli web services in c# che ho scritto: spero di essere abbastanza esaustivo nello scrivere quello che succede.
Sto usando Windows Vista Ultimate con IIS 7; tutti i file vengono salvati in wwwroot.
Per prima cosa, ho creato il web service in c# (il codice restituisce semplicemente un numero casuale tra 1 e 90), salvandolo come file randomnumber.asmx:
Dopo questo, ho aperto il file in internet explorer 7 tramite http://localhost/randomnumber.asmx, controllato che funzionasse sempre nel browser e da qui ho anche ricavato il corrispondente wsdl, salvandolo sempre nella root di IIS.codice:<%@ WebService Language="C#" class="RandomNumberService" %> using System; using System.Web.Services; [WebService(Namespace="http://localhost")] class RandomNumberService { [WebMethod] public int getRandomNumber() { // Create a new random class Random RandomClass = new Random(); // Obtain a random integer in a range between 1 and 90 int RandomNumber = RandomClass.Next(1,90); return (RandomNumber); } }
Dopo fatto ciò, ho scritto un semplice web client in php, simplerandomnumbertest:
Codice PHP:<?php
$client = new SoapClient("http://localhost/randomnumber.wsdl");
$result = $client->getRandomNumber();
echo("Random number is: " . $return);
?>
L'ho eseguito ma mi dava come errore "Cannot convert type 'int' to 'string'".
Ho provato convertendo nel codice c# l'int in string, rinominando anche il file come randomnumberstr.asmx
Il nuovo codice era:
Ho ovviamente di nuovo ricavato il file wsdl e praticamente nel client php ho riscritto solo la riga:codice:<%@ WebService Language="C#" class="RandomNumberService" %> using System; using System.Web.Services; [WebService(Namespace="http://localhost")] class RandomNumberService { [WebMethod] public string getRandomNumber() { // Create a new random class Random RandomClass = new Random(); // Obtain a random integer in a range between 1 and 90 int RandomNumber = RandomClass.Next(1,90); string strRandomNumber = RandomNumber.ToString(); return (strRandomNumber); } }
A questo punto ho ottenuto l'errore:Codice PHP:$client = new SoapClient("http://localhost/randomnumberstr.wsdl");
"Catchable fatal error: Object of class stdClass could not be converted to string in (path/del/file/client/php) line 5".
Dopo vari altri e non proficui esperimenti, ho inserito, nel client, al posto della linea di codice
la linea:Codice PHP:echo("Random number is: " . $return);
che mi restituiva il risultato corretto insieme ad altri parametri, ad esempio:Codice PHP:print_r($result);
codice HTML:stdClass Object ( [getRandomNumberResult] => 45 )
A questo punto, ho deciso per curiosità, di scrivere un semplice web service sempre in c# che, passando due numeri, mi restituisse la loro somma.
Ho chiamato il web service add.amsx (da cui ho ricavato poi il relativo file wsdl):
e il client simpleaddclient.php:codice:<%@ WebService Language="C#" class="AddService" %> using System; using System.Web.Services; [WebService(Namespace="http://localhost")] class AddService { [WebMethod] public int add(int left, int right) { return (left+right); } }
Ho testato il web service senza client nel browser e funzionava, una volta invece che lo testavo con il client il risulato era:Codice PHP:<?php
$client = new SoapClient("http://localhost/add.wsdl");
$result = $client->add(5,7);
print_r($result);
?>
codice HTML:stdClass Object ( [addResult] => 0 )
La cosa curiosa, oltre al fatto che restituisce 0 ovviamente, è che se riprovo il primo web service scritto con il realtivo php client (quello con echo e non con print_r), ottengo non più l'errore segnalato prima, bensì la stringa:
senza quindi nessun valore, ma neanche senza l'errore "catchable....."codice HTML:Random number is:
A questo punto, se c'è qualcuno che mi potesse dare una mano sarebbe veramente ben accetto.
Praticamente se sapessi come trattare l'oggetto che viene restituito al client nella riga, credo che avrei risolto almeno il primo problema.Codice PHP:$result = $client->getRandomNumber();
Il secondo problema è perché il secondo client restituisce somma 0, invece della somma corretta.
Ogni aiuto è grandemente apprezzato.
--
Saluti,
Marco Mangiante

Rispondi quotando