I Web Services sono ormai diventati una delle migliori soluzioni per trasferire dati attraverso il protocollo SOAP utilizzando lo standard XML.
Ma non è lunico sistema, si ha la possibilità di trasferire dati utilizzando il protocollo HTTP effettuando una richiesta ad una risorsa web.
Le classi utilizzate sono la
HttpWebRequest e la
HttpWebResponse che sono presenti nel namespace
System.Net.
Queste due classi ereditano rispettivamente da
WebRequest e da
WebResponse.
Infatti quando si esegue una richiesta non viene richiamato il costruttore della classe
HttpWebRequest, ma viene utilizzato il metodo
Create() della WebRequest.
C#HttpWebRequest request = (HttpWebRequest)WebRequest.Create(<a target="_blank" href="http://www.test.com">http://www.test.com</a> );
VB.NETDim request as HttpWebRequest = CType(WebRequest.Create(<a target="_blank" href="http://www.test.com">http://www.test.com</a> ), HttWebRequest)
Bisogna "castare" il metodo alla classe
HttpWebRequest perchè il metodo Create ritorna una WebRequest, essendo che questultima viene ereditata non abbiamo problemi di conversione.
Il Framework solleva uneccezione se è passato un'URI non valido (può essere sia http:// che https://)
Per poter passare dei dati via HTTP dobbiamo impostare il metodo che deve essere nel nostro caso
"POST"[/].
request.Method = "POST"
Possiamo inoltre impostare il timeout, come anche impostare le credenziali per accedere alla risorsa web
request.Timeout = 10000
//imposto le credenziali di base
request.Credentials = CredentialCache.DefaultCredentials
//oppure assegno username e password e dominio
request.Credentials = new System.Net.NetworkCredential ("administrator", "password","domain");
Se per accedere alla risorsa passate per un server proxy si può impostare anche questo
request.Proxy = new WebProxy(addressProxy);
Dopo aver impostato le varie proprietà passiamo i dati alla risorsa Webattraverso il metodo GetRequestStream, che accetta un Array di Byte, per convertire il dato da passare utilizziamo la classe ASCIIEncoding (namespace System.Text) come abbiamo visto nel precedente tip:
http://www.dotnethell.it/tips/ConvertArrayBytes.aspx
C#
string content ="Test Request Dotnethell"
ASCIIEncoding encoding=new ASCIIEncoding();
byte[] buffer =encoding.GetBytes(content);
// imposto il contenttype generico per la richiesta che in base al tipo di richiesta fatta si deve impostare il content type corretto(Es. text/xml, text/html ecc)
request.ContentType="application/x-www-form-urlencoded";
// imposto la lunghezza dei dati passati nella richiesta.
request.ContentLength=content.Length;
Stream newStream=request.GetRequestStream();
//scrivo nello stream
newStream.Write(buffer,0,buffer.Length);
newStream.Close();
VB.NET
Dim content as String ="Test Request Dotnethell"
Dim encoding as New ASCIIEncoding()
Dim buffer[] as Byte =encoding.GetBytes(content);
// imposto il contenttype generico per la richiesta che in base al tipo di richiesta fatta si deve impostare il content type corretto(Es. text/xml, text/html ecc)
request.ContentType="application/x-www-form-urlencoded"
// imposto la lunghezza dei dati passati nella richiesta.
request.ContentLength=content.Length;
Stream newStream=request.GetRequestStream();
//scrivo nello stream
newStream.Write(buffer,0,buffer.Length);
newStream.Close();
attraverso il metodo GetResponse recuperiamo la risposta:
C#
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
VB.NET
Dim response as HttpWebResponse = CType(request.GetResponse,HttWebResponse)
Possiamo recuperare lo stream della risposta con il metodo GetResponseStream.
I metodi GetRequestStream, GetResponse e GetResponseStream possono essere utilizzati anche in modalità asincrona utilizzando i metodi Begin* e End*.
Come ultima cosa vi ricordo sempre di utilizzare il codice in un blocco try/catch e per verificare le eccezioni restituite potete usare la classe WebException che espone la proprietà Status che restituisce il tipo di eccezione che si è verificata.