25

Nov

Demo 7 – Operazioni remote con WebServices

A me piacciono molto i WebServices e li userei per praticamente tutto ciò che faccio. Quando ho scoperto che li potevo usare anche sul mobile le cose si sono fatte molto interessanti. Siccome c’è molta roba in giro sulla creazione di WebServices, lascio la teoria ad altre fonti (wiki o altri articoli) e passo al sodo; cosa vedremo:

  • Aggiunta di un riferimento ad un WebService remoto
  • Invocazione sincrona (il client aspetta fino al roundtrip dell’operazione)
  • Invocazione asincrona (il client passa il controllo ad un altro thread)

Aggiunta della reference

image Per prima cosa aggiungiamo una reference al servizio remoto, analogamente a come aggiungeremmo una reference ad una libreria locale, quindi inseriremo l’url del WS, nel nostro caso un bellissimo WS che uso sempre per le demo (quello del Codice Fiscale di dotnethell).

A questo punto lascio il discovery a Visual Studio; per dovere di cronaca VS in pochi secondi si connette all’URL, tramite il discovery sa dove andare a trovare il WSDL, tramite il WSDL capisce la definizione del WS remoto e crea delle classi proxy per wrappare le operazioni di invocazione remote. Inoltre crea anche tutti i tipi dati utilizzati presenti negli XSD referenziati dal WSDL stesso.

Risultato? Avrete in 10 secondi un set di classi con metodi per invocare il WS remoto come se fosse una libreria locale, avendo pure la soddisfazione di utilizzare classi tipizzate per i dati in ingresso/uscita.

Ma vediamo qualche screenshot dei passaggi.

 

image

image

 

A questo punto, come si vede in figura a DX, abbiamo una classe che espone i metodi per il calcolo e il controllo del codice fiscale. Ora mi interessa controllare la validità di un codice fiscale, sul mio dispositivo, SENZA dover implemetare localmente la logica di elaborazione.

NB: questo paradigma di spostare la logica di elaborazione “out-of-the-box” è molto di moda soprattutto oggi con l’avvento e la diffusione del Cloud Computing. Non è per nulla strano pensare di delegare operazioni onerose che dovrebbe svolgere un dispositivo, ad un server remoto in giro per il mondo. Soprattutto se il server in questione ha una capacità di elaborazione di diversi ordini di grandezza superiore. Parentesi chiusa.

Invocazione sincrona

Nell’invocazione sincrona, il client chiama il metodo come se fosse locale e l’istruzione successiva verrà eseguita solo al completamento della chiamata. Questa cosa, in relazione al fatto che stiamo operando su internet, che per definizione è best effort, non ci può dare garanzie sulle tempistiche, lasciando potenzialmente il dispositivo freezato (da freezing) per qualche secondo.

Quindi in condizioni sincrone. il codice è banale:

image Facciamo eseguire e proviamo il programma… ma ci serve una connessione internet DAL DISPOSITIVO: quindi facciamo il cradle e sfruttiamo la connessione del nostro computer.

image Nota: lo spazio vuoto nello screencapture era agghiacciante, perciò ho messo lo smile.

Invocazione asincrona

Per invocazione asincrona intendiamo dire che, dopo aver avviato la richiesta al WS remoto (ovvero aver fisicamente fatto la chiamata POST su http), il controllo della risposta e la sua attesa viene passata ad un altro thread, mentre il primo può tornare sulla terra e continuare le operazioni. Questa cosa è ESSENZIALE per sviluppare correttamente le applicazioni: ricordatevelo.

NB: Sulla carta non rende, ma nella realtà, una attesa sul thread principale, provoca una interruzione temporanea anche di tutta la gestione della reattività dell’interfaccia grafica.

Ora, come parlare di invocazioni asincrone senza parlare di delegate? Ma NON HO VOGLIA, ho mangiato pesante e i delegate sono più indigesti dei marron glaces. Quindi, arriviamo al codice, confrontiamolo con il precedente e commentiamolo:

image Invece che chiamare la funzione, io ne chiamo la versione asincrona (automaticamente generata nel proxy di visual studio) la quale prende, oltre che ai parametri della funzione, anche un delegate incaricato di gestire il callback e, quindi, la logica da applicare al momento della risposta da parte del servizio remoto.

Sempre per le motivazioni sopra (la pigrizia) ho usato la sintassi compatta creando una innerfunction e definendone il corpo direttamente inline.

Il comportamento sarà questo:

  • La BeginControllaCodiceFiscale avvierà un thread che chiamerà il webservice
  • All’arrivo della risposta verrà eseguita una generica funzione la cui signature è
    • “void nome(IAsyncResult obj)”
  • Nel nostro caso la suddetta funzione è implementata inline
  • Quindi, dopo la chiamata Begin la funzione button1_Click terminerà e la message box comparirà solo dopo qualche secondo, permettendo al thread principale di svolgere qualsivoglia operazione nel frattempo.

Fine!!!!

by Roberto Freato on 11/25/2009
Post archive