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