Home > Guide > Un client Web Services in C#

Un client Web Services in C#

I Web Services sono dei sistemi web che espongono delle interfacce software che possono essere richiamate da altri sistemi. Alcuni siti, come WebserviceX.NET, offrono dei Web Services utilizzabili liberamente dalle proprie applicazioni.

Il protocollo maggiormente utilizzato per interagire con un Web Service è SOAP, che definisce il formato della "busta" dentro la quale vengono incapsulati i messaggi che l'applicazione scambia con il Web Service, che vengono solitamente trasportati utilizzando il protocollo HTTP.

Visual Studio offre un tool che, a partire dall'URL di un Web Service, genera automaticamente una classe .NET che ci permette di utilizzare il servizio all'interno di un nostro progetto.

Nel seguente esempio, utilizzeremo un Web Service gratuito che permette di verificare la validità di un indirizzo web: Validate Email Address. Per generare la classe ValidateEmail in C#, apriamo il prompt dei comandi di Visual Studio e digitiamo:

wsdl /l:CS /protocol:SOAP http://www.webservicex.net/ValidateEmail.asmx

Viene così generato il file ValidateEmail.cs che importeremo nel nostro progetto. Esso contiene le seguenti classi:

  • La classe ValidateEmail con il metodo IsValidEmail ed altri metodi ad esso collegati.

  • La classe IsValidEmailCompletedEventArgs.

  • Il delegate IsValidEmailCompletedHandler.

Per utilizzare tali classi nel nostro progetto, dobbiamo aggiungere un riferimento a System.Web.Services mediante Project->Add Reference...

Per utilizzare il metodo IsValidEmail in maniera sincrona è sufficiente creare un nuovo oggetto della classe ValidateEmail e chiamarne il metodo IsValidEmail. Il seguente esempio è tratto da un progetto Windows Form, nel quale ho creato una casella di testo dove inserire l'indirizzo e-mail da verificare ed un pulsante per lanciare il metodo:

    public partial class MainForm : Form
    {
       
private ValidateEmail validateServer = new ValidateEmail();

       
public MainForm()
        {
            InitializeComponent();
        }

        private void validateEmailButton_Click(object sender, EventArgs e)
        {
           
bool valid = validateServer.IsValidEmail(emailAddressTextBox.Text);
           
if (valid)
                MessageBox.Show(
"L'indirizzo e-mail inserito è valido.", "Verifica completata", MessageBoxButtons.OK, MessageBoxIcon.Information);
            
else
                MessageBox.Show(
"L'indirizzo e-mail inserito NON è valido.", "Verifica completata", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }

La chiamata sincrona del metodo ha lo svantaggio che l'applicazione non risponde finchè il metodo non viene completato. Poichè si tratta di una chiamata ad un servizio web, questa può durare alcuni secondi.

La classe ValidateEmail offre anche il metodo IsValidEmailAsync, per chiamare il metodo in maniera asincrona, ovvero in un thread separato. In questo modo la nostra applicazione può continuare a svolgere altri compiti mentre attende il completamento della chiamata al servizio web. Nel nostro caso, potremmo segnalare all'utente uno stato di attesa, senza perdere però il controllo dell'applicazione.

L'applicazione può rilevare il completamento dell'operazione mediante l'evento IsValidEmailCompleted, al quale associamo un handler del tipo IsValidEmailCompletedHandler. La funzione richiamata dall'handler accetta un parametro di tipo object ed un parametro di tipo IsValidEmailCompletedEventArgs. Il risultato della chiamata al servizio web si ottiene dalla proprietà Result di questo parametro, mentre se la chiamata è fallita l'eccezione viene ritornata nella proprietà Error (da testare prima di leggere il risultato):

    public partial class MainForm : Form
    {
       
private ValidateEmail validateServer = new ValidateEmail();

       
public MainForm()
        {
            InitializeComponent();

            validateServer.IsValidEmailCompleted +=
new IsValidEmailCompletedEventHandler(validateServer_IsValidEmailCompleted);
        }

       
private void validateEmailButton_Click(object sender, EventArgs e)
        {
            validateServer.IsValidEmailAsync(emailAddressTextBox.Text);
            EnableControls(
false);
        }

       
private void validateServer_IsValidEmailCompleted(object sender, IsValidEmailCompletedEventArgs e)
        {
           
if (e.Error == null)
            {
               
bool valid = e.Result;
               
if (valid)
                    MessageBox.Show(
"L'indirizzo e-mail inserito è valido.", "Verifica completata", MessageBoxButtons.OK, MessageBoxIcon.Information);
               
else
                    MessageBox.Show(
"L'indirizzo e-mail inserito NON è valido.", "Verifica completata", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
           
else
            {
                MessageBox.Show(e.Error.Message,
"Errore", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            EnableControls(
true);
        }

       
private void EnableControls(bool enable)
        {
            emailAddressTextBox.Enabled = enable;
            validateEmailButton.Enabled = enable;
            toolStripStatusLabel1.Text = enable ?
"Pronto" : "Richiesta al server in corso...";
        }
    }

Cliccando sui seguenti link potete scaricare il progetto relativo all'esempio esposto ed un secondo progetto che utilizza un Web Service che effettua la conversione di valute. I progetti sono stati realizzati con Visual Studio 2008.

download.gif (383 byte)Emailvalidator.zip (78 kb)

download.gif (383 byte)Currencyconverter.zip (59 kb)

Home
Scrivimi

Torna su
Indietro

Visite dal 17 marzo 2004

Per visualizzare al meglio il sito si consiglia di utilizzare Mozilla Firefox oppure Internet Explorer versione 5 o successiva alla risoluzione di 800x600 con caratteri medi.