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:
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 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.
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:
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);
}
}
Ho ovviamente di nuovo ricavato il file wsdl e praticamente nel client php ho riscritto solo la riga:
Codice PHP:
$client = new SoapClient("http://localhost/randomnumberstr.wsdl");
A questo punto ho ottenuto l'errore:
"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
Codice PHP:
echo("Random number is: " . $return);
la linea:
Codice PHP:
print_r($result);
che mi restituiva il risultato corretto insieme ad altri parametri, ad esempio:
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):
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);
}
}
e il client simpleaddclient.php:
Codice PHP:
<?php
$client = new SoapClient("http://localhost/add.wsdl");
$result = $client->add(5,7);
print_r($result);
?>
Ho testato il web service senza client nel browser e funzionava, una volta invece che lo testavo con il client il risulato era:
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:
codice HTML:
Random number is:
senza quindi nessun valore, ma neanche senza l'errore "catchable....."
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
Codice PHP:
$result = $client->getRandomNumber();
, credo che avrei risolto almeno il primo problema.
Il secondo problema è perché il secondo client restituisce somma 0, invece della somma corretta.
Ogni aiuto è grandemente apprezzato.
--
Saluti,
Marco Mangiante