Accesso ai dati in Silverlight 2.0
di Alessio Leoncini, in Silverlight 2.0, 30 settembre 2008
Gestione dinamica delle risorse
Nel precedente esempio il file XML fa parte del pacchetto XAP e quindi per rendere effettiva una sua modifica è necessario ricompilare e ridistribuire il progetto o comunque sostituire manualmente il file nel pacchetto; per rendere più veloce questo tipo di interventi è possibile caricare una risorsa presente direttamente come file dello stesso sito web o anche di un sito esterno.
Per questo tipo di attività possono essere usati gli oggetti WebClient e HttpWebRequest, entrambi eseguono richieste HTTP asincrone in modo da poter accedere a file statici, a pagine web o web services in modo parallelo rispetto ai processi in esecuzione nell'interfaccia grafica.
E' molto importante per l'usabilità e la stabilità delle applicazioni implementare la modalità di accesso asincrono a risorse esterne ai progetti.
Per propria natura una risorsa non ancora caricata dal plugin nella fase iniziale di download non assicura la certezza della disponibilità al momento dell'effettiva richiesta da parte dell'utente o dall'applicazione stessa.
Non solo, il caricamento di tali tipologie di risorse è fortemente condizionato dalla disponibilità e dalla velocità di connessione nel momento della richiesta, nei casi di scarse condizioni di comunicazione la modalità asincrona non blocca l'utilizzo del programma pur mantenendosi in attesa del completamento della ricezione dati.
Inoltre sia l'oggetto WebClient che HttpWebRequest possiedono funzionalità per il controllo degli errori di comunicazione, per l'annullamento delle richieste in funzione di determinati eventi e per il controllo della durata del trasferimento dati con i quali realizzare messaggi informativi all'utente e grafici di avanzamento.
- WebClient
L'oggetto WebClient semplifica le procedure di invio e ricezione dati da e verso una risorsa remota, il seguente esempio è del tutto analogo al precedente fatta eccezione che il file XML non è più interno al file XAP ma è un semplice file del sito web che ospita il progetto:
WebClient client = new WebClient(); client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted); client.OpenReadAsync(new Uri("../MenuHyperLinkFromWebXML.xml", UriKind.Relative)); void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { Stream data = e.Result; if (!e.Cancelled && e.Error == null && data != null) { using (StreamReader reader = new StreamReader(data)) { XDocument menuSource = XDocument.Load(reader); IEnumerable<XElement> items = from item in menuSource.Elements("menu").Elements() select item; foreach (XElement item in items) { HyperlinkButton link = new HyperlinkButton(); link.Content = item.Element("text").Value; //.. Menu.Children.Add(link); Menu.UpdateLayout(); } } } }
In questo snippet è possibile vedere come l'oggetto WebClient esegua una richiesta asincrona chiamando il metodo OpenReadAsync, il path del file XML può essere un percorso assoluto specificando un valore completo del suffisso http:// oppure può anche descrivere un percorso relativo ed in tal caso di default deve riferirsi alla posizione del file XAP nel sito web, solitamente all'interno della cartella ClientBin.
A seguito della chiamata al metodo OpenReadAsync il codice non rimane in attesa di risposta ma prosegue nell'esecuzione, al termine del caricamento viene scatenato l'evento OpenReadCompleted a cui è stata eseguita la registrazione prima della chiamata stessa.
Nel metodo relativo all'evento OpenReadCompleted è possibile gestire lo stato finale di risposta a questo tipo di richiesta, il parametro OpenReadCompletedEventArgs oltre a contenere lo Stream dei dati con la proprietà Result, contiene anche altre informazioni sull'esito della transizione. La proprietà Error può valorizzarsi in funzione di errori di varia natura e può contenere molti dati per dare complete informazioni all'utente.
Nell'esempio precedente lo Stream di dati viene elaborato attraverso l'oggetto StreamReader in modo da poter essere pronto alla parserizzazione del metodo Load dell'oggetto XDocument, il successivo codice di preparazione del menu è del tutto analogo a quello illustrato nel caso di file XML integrato nel file XAP.
Con l'oggetto WebClient è possibile anche inviare dati in POST, il metodo OpenWriteAsync apre uno stream di dati per la scrittura in una risorsa remota consentendo upload di un vasto genere di informazioni. Anche questo metodo lavora in modo asincrono e dispone di un evento OpenWriteCompleted per la gestione del termine dell'operazione.
L'oggetto WebClient dispone anche di metodi specifici per recuperare ed inviare informazioni di tipo stringa, DownloadStringAsync e UploadStringAsync eseguono funzionalità analoghe ai metodi descritti in precedenza ma consentono anche il controllo dello stato di avanzamento delle comunicazioni.
Con gli eventi DownloadProgressChanged e UploadProgressChanged ed i corrispondenti DownloadProgressChangedEventArgs e UploadProgressEventArgs è possibile realizzare barre di caricamento per informare l'utente della durata dell'esecuzione delle operazioni.
- HttpWebRequest
HttpWebRequest è l'oggetto standard del .Net Framework per le comunicazioni con risorse remote in protocollo HTTP, è presente anche nel runtime di Silverlight in virtù della maggiore completezza di WebClient.
Rispetto a quest'ultimo con HttpWebRequest è possibile avere più controllo su gli Header della richiesta in modo da poter implementare ad esempio autenticazioni/autorizzazioni e comunque avere maggiore controllo sulla comunicazione.
Restrizioni di sicurezza per l'accesso remoto
WebClient e HttpWebRequest consentono l'accesso anche a risorse realmente remote raggiungibili attraverso la rete, tuttavia per garantire un alto livello di sicurezza queste intercomunicazioni sono vincolate ad impostazioni definite nello specifico file clientaccesspolicy.xml.
Tale file deve essere presente nella root del sito web che ospita la risorsa che si vuole rendere accessibile, ecco un esempio:
<?xml version="1.0" encoding="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from http-request-headers="*"> <domain uri="http://www.aspitalia.com" /> </allow-from> <grant-to> <resource path="/Silverlight" include-subpaths="true" /> </grant-to> </policy> </cross-domain-access> </access-policy>
Nel file è possibile specificare in modo capillare il consenso a singoli domini e a specifiche risorse contenute in definite cartelle; inoltre è possibile definire l'accesso a tali risorse solo da quelle richieste con determinati Headers. Attraverso una buona configurazione di questo file è possibile garantire i propri siti web da i più insidiosi rischi di sicurezza.
Attenzione: Questo articolo contiene un allegato
Contenuti dell'articolo
Sullo stesso argomento
-
Applicazioni Silverlight con il cloud computing su Windows Azure
-
Aggiungere interattività al controllo Chart di Silverlight 3.0
-
Realizzare un sito completo in Silverlight: una galleria fotografica
-
Supporto audio e video in Silverlight 3.0
-
Effetti speciali sulle immagini in Silverlight 3.0
-
Anteprima di Expression Blend 3.0
-
Le novità di Silverlight 3.0 beta 1
-
Realizzare un menu riutilizzabile utilizzando DataTemplate e DataBinding
-
Un tocco di stile alle applicazioni Silverlight: style e template
-
Multithreading in Silverlight 2.0

















Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.