lunedì 5 settembre 2011

Silverlight utilizzo di un servizio web VB.Net e C#

Riporto l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_utilizzare-un-servio-web-in-silverlight_1087.aspx



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.



Linq 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.


Nessun commento: