Introduzione
In questo articolo, vedremo come accedere ad un servizio web, o più comunemente definito web services, servizio web di tipo (ASMX) creato in .Net 4.
Con la nuova versione di Silverlight, lo scambio dei dati ed informazione, avviene con WCF (Windows communication foundation) ma nel caso di un servizio web esistente o se conoscente bene solo questa tecnologia, questo articolo illustra il suo utilizzo
Creazione db
Si crea un db, con una tabella (anagrafica) con campi, id (contatore numerico), nome e cognome quest’ultimi due di tipo varchar(50).
A questo punto valorizzate la tabella, la base dati è il primo passo per l'utilizzo di di questo esempio.
Creazione del servizio
Terminata la creazione della tabella, non ci resta che creare il servizio web., che "leggerà" i dati dalla nostra tabella tramite Linq.
Dopo aver creato un nuovo progetto in SL 4, nella finestra wizard, lasciamo i valori di default, ossia come host application Silverlight lasciamo web e come tipo di progetto Asp.Net web application project e confermiamo il tutto tramite il pulsante ok.
Nella finestra “esplora soluzione” fate click, tramite tasto destro sul nome del progetto web, nel menu che viene aperto, selezionate la voce "new item".
Nella finestra che viene aperta, selezionate nella parte a sinistra , la categoria Web, mentre nella parte destra, dei modelli, selezionate web services, di norma, situato in basso, l’ultimo della lista.
A questo punto verrà creato il nostro servizio.
Ling to Sql per accedere ai dati
La gestione dei dati, la faremo con Linq to SQl, in questo modo, vedremo un nuovo modo per accedere ai dati.
Sempre nel progetto web, fate click tramite pulsante destro, sul progetto nella finestra esplora soluzione.
Nel menu che viene visualizzato, selezionate la voce "new item" (o nuovo elemento), nella finestra che viene aperta, selezionate nella parte sinistra, la categoria data, mentre sulla parte destra, selezionate la voce Linq to Sql Class, il tutto come mostrato in figura 1.
Figura 1
A questo punto, confermate le scelte tramite il pulsante “Add”.
Per utilizzare linq, bisogna aver creato una connessione dati nella finestra esplora server, terminata la creazione del collegamento alla base dati, trascinate la tabella di vostro interesse (nel nostro caso “Anagrafica”) per la visualizzazione dei dati, nello spazio bianco.
In questo modo, si ha la gestione dei dati di quella tabella.
Ritorniamo nel nostro servizio web e si crea un metodo “GetDati”, che restituisce una lista della classe persona.
Qui di seguito si riporta il codice relativo alla classe persona e del metodo GetDati.
VB.Net
'Classe persona
Public Class Persona
Private _nome As String
Public Property Nome() As String
Get
Return _nome
End Get
Set(ByVal value As String)
_nome = value
End Set
End Property
Private _cognnome As String
Public Property Cognome() As String
Get
Return _cognnome
End Get
Set(ByVal value As String)
_cognnome = value
End Set
End Property
End Class
'Servizio web
Public Class WebService1
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function GetDati() As List(Of Persona)
Dim dati As New DataClasses1DataContext()
Dim risultato = From tab In dati.Anagraficas
Select pers = New Persona With {
.Cognome = tab.Cognome,
.Nome = tab.Nome} Select pers
Return risultato.ToList()
End Function
End Class
C#
//Classe persona
public class Persona
{
private string _nome;
public string nome
{
get { return _nome; }
set { _nome = value; }
}
private string _cognome;
public string cognome
{
get { return _cognome; }
set { _cognome = value; }
}
}
//Servizio web
public class WSDati : System.Web.Services.WebService
{
[WebMethod]
public List<Persona> GetDati()
{
using (DataClasses1DataContext test = new DataClasses1DataContext())
{
var risultato = from ris in test.Anagraficas
select new Persona
{
nome = ris.Nome,
cognome = ris.Cognome
};
return risultato.ToList();
}
}
}
La creazione del servizio web, è giunta alla fine, dobbiamo creare un file, che ci permetta di gestire il servizio web, in maniera che la comunicazione non comporti errori, per via del dominio, cross domain
Si potrebbe verificare un errore, simile a quello della figura 2.
Figura 2
Il fine, si deve trovare nel servizio web e si deve chiamare “clientaccesspolicy.xml” qui di seguito si riporta il file xml, completo.
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
Progetto Silverlight
Ritorniamo nel progetto Silverlight, ed inseriamo un controllo datagrid, dove la proprietà “AutoGenerateColumns” impostiamo a true.
Nella finestra esplora soluzioni, facciamo click sul progetto Silverlight e dal menu che viene visualizzato, selezioniamo la voce “Add Service References…” nella finestra che viene aperta, inseriamo l’url del nostro servizio web, e come namespace impostiamo il valore “WsDati”.
Ora passiamo in visualizzazione codice, nell’evento load della nostra pagina, si deve gestire il nostro riferimento web.
Qui di seguito si riporta il frammento di codice per i due linguaggi.
VB.Net
Private Sub LayoutRoot_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles LayoutRoot.Loaded
Dim ServizioDati As New WsDati.WebService1SoapClient()
AddHandler ServizioDati.GetDatiCompleted, AddressOf ServizioDati_GetDatiCompleted
ServizioDati.GetDatiAsync()
End Sub
Private Sub ServizioDati_GetDatiCompleted(sender As Object, e As WsDati.GetDatiCompletedEventArgs)
If e.Error Is Nothing Then
DataGrid1.ItemsSource = e.Result
Else
'errore
MessageBox.Show(e.Error.Message)
End If
End Sub
C#
private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
{
WsDati.WSDatiSoapClient ServizioDati = new WsDati.WSDatiSoapClient();
ServizioDati.GetDatiCompleted += new EventHandler<WsDati.GetDatiCompletedEventArgs>(ServizioDati_GetDatiCompleted);
ServizioDati.GetDatiAsync();
}
void ServizioDati_GetDatiCompleted(object sender, WsDati.GetDatiCompletedEventArgs e)
{
if (e.Error != null)
{
//errore
MessageBox.Show(e.Error.Message);
}
else
{
dataGrid1.ItemsSource = e.Result;
}
}
Ora, non resta che testare il nostro applicativo, eseguendo il nostro progetto.
Conclusioni
Abbiamo visto diversi scenari per l'accesso a la gestione dei dati in Silverlight. La gestione di un servizio web per il caricamento dei dati, la tecnologia Linq, per eseguire query nel database, e Silverlight, per visualizzare tali dati.
Le tecniche per gestire una fonte dati, sono diverse, in questo articolo si è voluto far comprendere l'utilizzo dei servizi web in Silverlight.