Redazione
a- a+

Web Service e Silverlight

Silverlight e Web services

Una funzione primaria di un'applicazione ASP.NET è l'abilità di interagire con un web server. in un'applicazione ASP.NET standard, ogni refresh della pagina causa delle nuove chiamate al web server, mentre in un'applicazione ASP.NET Ajax, l'interazione con il server è minima anche se si mantiene una comunicazione con il web server. Ad ogni modo l'interazione con il web server può essere ottimizzata effettuando delle chiamate ad un Web service. In un'applicazione Silverlight , una volta che l'applicazione è stata scaricata sulla macchina client, l'interazione con il server avviene solo su richiesta del client. La metodologia più comune di comunicazione fra un'applicazione Silverlight e un Web service è l'invocazione di una chiamata al Web service.

Un Web service è un componente, simile ad un file procedurale o ad un oggetto con dei metodi, richiamabile via Web usando i protocolli Web. Proprio come un file procedurale o un oggetto che possiede dei suoi metodi, viene richiamato dal codice per fornire un servizio al codice invocante, ossia le funzioni del Web service. Il codice in grado di accedere al Web service richiama quest'ultimo per fornire funzionalità aggiuntive. I Web services usano di default HTTP come protocollo di comunicazione e un linguaggio basato su XML detto Simple Object Access Protocol (SOAP), per il trasporto dei dati. Proprio come ogni client che abbia un browser può vedere una pagina web, per via dell'utilizzo degli standard Web, un Web service può essere invocato da qualsiasi linguaggio di programmazione capace di lavorare con gli standard aperti del Web. In più, siccome si utilizza il protocollo HTTP, i Web services sono generalmente accessibili anche in presenza di firewall.

E' quindi possibile sfruttare un Web service anche per un'applicazione Silverlight. Ad ogni modo, i Web services risiedono su un web server, mentre le applicazioni Silverlight stanno sulle macchine lato client, quindi potrebbe essere difficoltoso testare la comunicazione fra un'applicazione Silverlight e un Web service su una singola macchina. In quest'articolo mostreremo sia come sfruttare un Web service e testare la comunicazione tra un'applicazione Silverlight e un Web service.

Sfruttare un Web service da Silverlight

Quando un'applicazione client invoca un metodo di un Web service, si dice che l'applicazione client sfrutta il Web service. La prima cosa che si dovrebbe notare è che ci sono delle limitazioni nello sfruttare i Web service dalla versione corrente di Silverlight: la versione 2.0 supporta solo l'utilizzo di Web services che risiedono sullo stesso server in cui risiede l'applicazione Silverlight che li utilizza. Sfruttare un Web service che non è ospitato sullo stesso web server dell'applicazione Silverlight richiede una chiamata ad un dominio esterno (cross-domain) e tali chiamate non sono supportate per ragioi di sicurezza, anche se potrebbero essere supportate in versioni future di Silverlight. .

In Silverlight i Web services possono essere sfruttati in più modi:

  • configurando una chiamata ad un metodo del Web service e passandogli documenti ben formati che non aderiscono allo schema SOAP includendo un wrapper SOAP (tecnica POX, ossia Plain Old XML). La classe System.Net.BrowserHttpWebRequest viene usata per porre delle chiamate ai metodi del Web service mentre la classe System.Net.HttpWebResponse viene usata per ricevere le risposte. Invocare un metodo di un Web service attraverso POX è piuttosto semplice da fare e la chiamata può essere sincrona o asincrona. Ad ogni modo, usare questo metodo rende il testing difficile se si usa il web server integrato in Visual Studio 2008;
  • passando dati formattati secondo la notazione JavaScript Object Notation (JSON). JSON è uno standard industriale per lo scambio dei dati che è compatto e ideale per le applicazioni Silverlight e ASP.NET Ajax. Le estensioni di ASP.NET AJAX, ora integrate nel .NET Framework, forniscono un nuovo attributo, System.Web.Script.Services.ScriptServiceAttribute, che è applicabile ad una classe di un Web service per trasportare i dati attraverso JSON. Qualsiasi Web service ASP.NET che deve essere invocato da Javascript da una pagina ASP.NET AJAX o un'applicazione Silverlight dev'esser marcato con l'attributo ScriptService. Questo articolo illustrerà come configurare un Web service ASP.NET e come sfruttarlo tramite un'applicazione Silverlight.


Configurare Visual Studio 2008

Le estensioni ASP.NET Futures forniscono funzionalità aggiuntive ad ASP.NET Ajax e Silverlight, fra le quali l'abilità di creare un sito web ASP.NET Futures in Visual Studio 2008. Tale tipologia di sito è l'ideale per testare le chiamate da un'applicazione Silverlight ai Web service ASP.NET.


Creazione del Web service

Creare innanzitutto un sito web ASP.NET Futures (qui sotto viene mostrata la finestra di dialogo che consente di fare ciò).

Creazione del sito
Fig 1: Creazione di un sito ASP.NET Futures

Una volta creato il sito, viene creata una pagina denominata Default.aspx che include un elemento pronto all'utilizzo con AJAX. Il passo successivo consiste nell'aggiungere al progetto un Web service ASP.NET.

Aggiunta di un servizio
Fig 2: aggiunta di un Web service mediante la finestra di dialogo Add New Item

Una volta fatto questo secondo passo, viene creata una cartella denominata App_Code nel progetto contenente un file con del codice. Per configurare il Web service per utilizzare JSON per la comunicazione dei dati, scommentare l'attributo [System.Web.Script.Services.ScriptService] in cima al file in App_Code. Poi, creare uno o più metodi nella classe Web service che possono esser invocati, come nell'esempio sottostante:

[WebMethod]  public string Greet(string name) {    return "Hey, " + name + " , how's it going?";  }

Testare infine il Web service per assicurarsi che tutto funzioni a dovere.


Creazione dell'applicazione Silverlight

Ora che abbiamo sistemato il Web service, quest'ultimo è pronto ad esser utilizzato da un'applicazione Silverlight, che andrà creata. Ecco come risulterà l'applicazione finale.

Applicazione
Fig 3: applicazione creata per testare il metodo

Es. 1: Page.xaml

<Canvasxmlns="http://schemas.microsoft.com/client/2007"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:c1="clr-namespace:C1.Silverlight;assembly=ClientBin/C1.Silverlight.dll"x:Name="parentCanvas"Loaded="Page_Loaded"x:Class="Greeter.Page;assembly=ClientBin/Greeter.dll"Width="800"Height="800">  <Canvas.Background>  <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5" SpreadMethod="Pad">    <GradientStop Color="#FFD2CBD2" Offset="0"/>    <GradientStop Color="#FF4D1E4C" Offset="1"/>  </LinearGradientBrush></Canvas.Background><TextBlock Width="142" Height="20" Canvas.Left="10" Canvas.Top="26">  <Run FontFamily="Segoe UI" FontSize="12" Foreground="#FF1E2576" Text="Enter Name:"/></TextBlock><c1:TextBox Canvas.Top="25" Canvas.Left="90" Width="200" x:Name="txtName" /><c1:Button AutoWidth="False" Width="100" Canvas.Top="25"     Canvas.Left="292" Text="Greet Me" Click="GetGreeting"/><TextBlock x:Name="tbGreeting" Width="506" Height="68" Canvas.Left="10" Canvas.Top="50" TextWrapping="Wrap">  <Run Text="" FontFamily="Segoe UI" FontSize="12" Foreground="#FF330909"/></TextBlock>    </Canvas>

 

<a href="/img/11/iframe_webSer1.html" title="Vedi esempio">Vedi esempio</a>;

 

Cliccate poi con il tasto destro del mouse sul progetto Silverlight in Solution Explorer e selezionate la voce Add Web Reference. Poiché il Web service sta nello stesso progetto dell'applicazione Silverlight, Visual Studio 2008 rende facile la localizzazione del Web service (si veda la finestra di dialogo qui sotto che consente tale azione).

Add Web Refrence Dialog
Fig 4: finestra di dialogo Add Web Reference

Una volta aggiunto il riferimento web al progetto Silverlight , i metodi del Web service possono essere invocati dall'applicazione Silverlight. Il gestore degli eventi per il bottone nell'applicazione Silverlight è localizzato nel codice per il file XAML e viene mostrato qui sotto.

<Canvasxmlns="http://schemas.microsoft.com/client/2007"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:c1="clr-namespace:C1.Silverlight;assembly=ClientBin/C1.Silverlight.dll"x:Name="parentCanvas"Loaded="Page_Loaded"x:Class="Greeter.Page;assembly=ClientBin/Greeter.dll"Width="800"Height="800">  <Canvas.Background>  <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5" SpreadMethod="Pad">    <GradientStop Color="#FFD2CBD2" Offset="0"/>    <GradientStop Color="#FF4D1E4C" Offset="1"/>  </LinearGradientBrush></Canvas.Background><TextBlock Width="142" Height="20" Canvas.Left="10" Canvas.Top="26">  <Run FontFamily="Segoe UI" FontSize="12" Foreground="#FF1E2576" Text="Enter Name:"/></TextBlock><c1:TextBox Canvas.Top="25" Canvas.Left="90" Width="200" x:Name="txtName" /><c1:Button AutoWidth="False" Width="100" Canvas.Top="25"     Canvas.Left="292" Text="Greet Me" Click="GetGreeting"/><TextBlock x:Name="tbGreeting" Width="506" Height="68" Canvas.Left="10" Canvas.Top="50" TextWrapping="Wrap">  <Run Text="" FontFamily="Segoe UI" FontSize="12" Foreground="#FF330909"/></TextBlock>    </Canvas>

 

<a href="/img/11/iframe_webSer1.html" title="Vedi esempio">Vedi esempio</a>;

 

In un'applicazione ASP.NET tradizionale, questo codice verrebbe eseguito senza errori. Ad ogni modo, a causa delle restrizioni cross domain presenti in Silverlight, quando tentate di eseguire questo codice in Visual Studio otterrete il seguente avvertimento:

Warning
Fig 5: avvertimento quando si effettuano chiamate cross-domain

Se selezionate Yes l'applicazione Silverlight dovrebbe comparire ma la chiamata al Web service non verrà eseguita. Quando si testa un'applicazione Silverlight invocando dei metodi di un Web service, Visual Studio simula un'applicazione client isolata in grado di comunicare con un Web server. Per configurare Visual Studio per simulare tale scenario con successo, è necessaria qualche configurazione aggiuntiva e il testing verrà eseguito dal progetto del Web service invece che in quello dell'applicazione Silverlight.

Cliccare quindi con il tasto destro sul progetto Web service e selezionate il collegamento Add Silverlight, che farà comparire la finestra sottostante:

Add Silverlight Link dialog box
Fig 6: Add Silverlight Link dialog box

Selezionate Yes.

Si potrà notare una cartella denominata ClientBin contenente gli assemblies e i file di debug del progetto per l'applicazione Silverlight, così come qualsiasi file XAML contenuto nell'applicazione Silverlight. Il collegamento Silverlight aggiunto al progetto Web service manterrà la sincronizzazione fra il progetto Web service e l'applicazione Silverlight in maniera tale che l'applicazione possa essere testata localmente con il Web service.

Per testare il file XAML dall'applicazione Silverlight, aprire la pagina Default.aspx page e aggiungere il controllo asp:Xaml. Settate l'attributo XamlUrl con il riferimento al file XAML da testare ed eseguite la pagina Default.aspx. La pagina contenente il file XAML selezionato dovrebbe apparire il browser come nell'immagine sottostante.

Resulting XAML page
Fig 7: pagina XAML risultante