Share via


Creazione di applicazioni Silverlight (WCF Data Services)

Importante

La libreria client di WCF Data Services 5.0 per Silverlight non è supportata per le applicazioni Windows Phone.A tale scopo è necessario utilizzare la libreria client di OData per Windows Phone, inclusa in Windows Phone 7.1 SDK.Per ulteriori informazioni, vedere Panoramica di Open Data Protocol (OData) per Windows Phone.Al momento nessuna libreria client per Windows Phone supporta OData v3.

La libreria client di WCF Data Services per Silverlight genera richieste HTTP a un servizio dati che supporta la versione 3 del protocollo OData e trasforma i dati contenuti nel feed di risposta di OData in oggetti nel client. Le due classi principali della libreria client sono DataServiceContext e DataServiceQuery<TElement>. La classe DataServiceContext incapsula operazioni eseguite su un servizio dati specificato. I servizi basati su OData sono senza stato. L'oggetto DataServiceContext gestisce tuttavia lo stato delle entità nel client tra interazioni con il servizio dati. In questo modo il client può supportare funzionalità quali il rilevamento delle modifiche e la gestione delle identità. La classe DataServiceQuery<TElement> rappresenta una query su un set di entità specifico. Per ulteriori informazioni, vedere Utilizzo di un servizio dati in un'applicazione .NET Framework (WCF Data Services). Per un esempio realistico di un'applicazione che utilizza un feed dal servizio dati Northwind di esempio, vedere la Guida rapida di WCF Data Services per Silverlight

Nota

In caso di utilizzo della libreria client di WCF Data Services per Silverlight, tutte le richieste al servizio vengono effettuate in modo asincrono.Per ulteriori informazioni, vedere Operazioni asincrone (WCF Data Services).

Di seguito sono elencate le diverse sezioni di questo argomento:

Generazione di classi del servizio dati client

È possibile utilizzare la finestra di dialogo Aggiungi riferimento al servizio in Visual Studio per aggiungere un riferimento a qualsiasi servizio che espone un feed di OData. Per ulteriori informazioni, vedere Generazione di classi del servizio dati client (WCF Data Services). Le classi del servizio dati client possono inoltre essere generate tramite lo strumento DataSvcUtil.exe al prompt dei comandi. Per ulteriori informazioni, vedere Procedura: generare in modo manuale classi del servizio dati client (WCF Data Services).

Nota

Se è installata la versione WCF Data Services 5.0, tramite lo strumento Aggiungi riferimento al servizio verrà automaticamente aggiunto un riferimento alla versione Microsoft.Data.Services.Client.SL.dll della libreria client, anziché un riferimento alla versione System.Data.Services.Client.dll inclusa in Silverlight.Se per qualsiasi motivo è necessario utilizzare la versione precedente del client Silverlight, è opportuno aggiungere manualmente un riferimento alla versione Silverlight della libreria client.Per ulteriori informazioni, vedere Procedura: generare in modo manuale classi del servizio dati client (WCF Data Services).

Accesso e modifica di risorse

In un'applicazione basata su Silverlight tutte le operazioni eseguite in un servizio dati sono asincrone. È possibile eseguire operazioni asincrone tramite coppie di metodi sulle classi DataServiceContext e DataServiceQuery<TElement> che iniziano rispettivamente con Begin ed End. I metodi Begin registrano un delegato chiamato dal servizio al completamento dell'operazione. I metodi End devono essere chiamati nel delegato registrato per gestire il callback dalle operazioni completate. Quando si chiama il metodo End per completare un'operazione asincrona, è necessario eseguire questa operazione dalla stessa istanza di DataServiceQuery<TElement> o DataServiceContext utilizzata per iniziare l'operazione. Ogni metodo Begin utilizza un parametro state in grado di passare un oggetto di stato al callback. Questo oggetto di stato viene recuperato come oggetto IAsyncResult fornito con il callback e viene utilizzato per chiamare il metodo End corrispondente per completare l'operazione asincrona. Ad esempio, quando si fornisce l'istanza di DataServiceQuery<TElement> come parametro state durante la chiamata del metodo BeginExecute sull'istanza, la stessa istanza di DataServiceQuery<TElement> viene restituita come IAsyncResult. Questa istanza di DataServiceQuery<TElement> viene quindi utilizzata per chiamare il metodo EndExecute per completare l'operazione di query. Per ulteriori informazioni, vedere Operazioni asincrone (WCF Data Services).

Poiché la libreria client di WCF Data Services per Silverlight accede al servizio dati in modo asincrono mediante protocolli di rete, è necessario utilizzare il metodo BeginInvoke della classe Dispatcher per effettuare il marshalling corretto dell'operazione di risposta al thread dell'applicazione principale (thread dell'interfaccia utente) dell'applicazione basata su Silverlight. Per ulteriori informazioni, vedere Synchronizing Data for Multithreading.

Esecuzione di query su risorse

La libreria client di WCF Data Services per Silverlight consente di eseguire query su un servizio dati OData mediante modelli di programmazione comuni di .NET Framework, incluso LINQ (Language-Integrated Query). Se viene chiamato il metodo BeginExecute in DataServiceQuery<TElement> o DataServiceContext, la libreria client converte una query o un URI (Uniform Resource Identifier) in un messaggio di richiesta HTTP GET. La libreria client riceve il messaggio di risposta corrispondente e lo converte in istanze delle classi del servizio dati client. Queste classi vengono rilevate dall'oggetto DataServiceContext a cui appartiene DataServiceQuery<TElement>. Per ulteriori informazioni, vedere Procedura: eseguire query asincrone sul servizio dati (WCF Data Services).

In alcuni scenari è utile conoscere il numero complessivo di entità contenute in un set di entità e non soltanto il numero nel feed restituito dalla query. Chiamare il metodo IncludeTotalCount in DataServiceQuery<TElement> per richiedere che nel risultato della query venga incluso il conteggio totale delle entità presenti nel set. In questo caso la proprietà TotalCount dell'oggetto QueryOperationResponse<T> restituito contiene il numero totale di entità nel set. È inoltre possibile utilizzare il metodo AddQueryOption per aggiungere altre opzioni di query supportate da OData a una query. Per ulteriori informazioni, vedere Esecuzione di query sul servizio dati (WCF Data Services).

Query LINQ

Poiché la classe DataServiceQuery<TElement> implementa l'interfaccia IQueryable<T> definita tramite LINQ, la libreria client di WCF Data Services per Silverlight è in grado di trasformare le query LINQ sui dati di set di entità in un URI che rappresenta un'espressione di query valutata in base a una risorsa del servizio dati. Ad esempio, la query LINQ indicata di seguito restituisce un feed che rappresenta una raccolta di entità Order filtrate per il valore di proprietà CustomerID fornito dall'utente nella casella di testo customerId.

' Define a query that returns orders for a give customer.
Dim query = From orderByCustomer In context.Orders _
                Where orderByCustomer.Customer.CustomerID = _
                Me.customerId.Text _
                Select orderByCustomer
// Define a query that returns orders for a give customer.
var query = from orderByCustomer in context.Orders
            where orderByCustomer.Customer.CustomerID == this.customerId.Text
            select orderByCustomer;

Caricamento di contenuto posticipato

Per impostazione predefinita, WCF Data Services limita la quantità di dati restituiti da una query. Se necessario, dal servizio dati è tuttavia possibile caricare in modo esplicito dati aggiuntivi, tra cui entità correlate, dati di risposta di paging e flussi di dati binari. Quando si esegue una query, vengono restituite solo le entità incluse nel set di entità indirizzato. Ad esempio, quando una query eseguita sul servizio dati Northwind restituisce le entità Customers, per impostazione predefinita non vengono restituite le entità Orders correlate, anche se esiste una relazione tra Customers e Orders. Le entità correlate possono essere caricate con la query originale (caricamento eager) o per singole entità (caricamento esplicito). Per ulteriori informazioni, vedere Caricamento di contenuto posticipato (WCF Data Services). In caso di utilizzo del client Silverlight e DataServiceCollection<T>, è possibile caricare raccolte di entità correlate da una proprietà di navigazione chiamando LoadAsync.

Suggerimento

In fase di scelta di un modello per il caricamento di entità correlate, considerare il compromesso in termini di prestazioni tra le dimensioni del messaggio e il numero di richieste al servizio dati.

Quando nel servizio dati è abilitato il paging, è necessario caricare in modo esplicito le pagine di dati successive dal servizio dati se il numero delle voci restituite supera il limite di paging. Poiché non è possibile determinare in anticipo il momento in cui si verifica il paging, è consigliabile abilitare l'applicazione client Silverlight in modo che gestisca in modo appropriato un feed di OData di paging. Per esempi di gestione di una risposta di paging. vedere Procedura: associare dati del servizio dati a controlli (client Silverlight) e Esecuzione di query sul servizio dati (WCF Data Services).

Proiezione di query

La proiezione fornisce un meccanismo per ridurre la quantità di dati nel feed di OData restituiti da una query specificando che nella risposta vengano restituite solo determinate proprietà di un'entità. Per ulteriori informazioni, vedere la pagina relativa all'opzione query di sistema Select ($select) in OData. È possibile aggiungere una clausola di proiezione a una query LINQ mediante la clausola select (Select in Visual Basic). I dati di entità restituiti possono essere proiettati in tipi di entità o non entità sul client. Le modifiche apportate a tipi di non entità non possono essere salvate nel servizio dati. Ad esempio, la query LINQ indicata di seguito proietta i dati Customer in un nuovo tipo di entità CustomerAddress nel client.

Dim query = From c In context.Customers _
                    Where c.Country = "Germany" _
                    Select New CustomerAddress With
                        {.CustomerID = c.CustomerID, _
                         .Address = c.Address, _
                         .City = c.City, _
                         .PostalCode = c.PostalCode, _
                         .Country = c.Country _
                        }
var query = from c in context.Customers
            where c.Country == "Germany"
            select new CustomerAddress
            {
                CustomerID = c.CustomerID,
                Address = c.Address,
                City = c.City,
                PostalCode = c.PostalCode,
                Country = c.Country
            };

Importante

Quando si salvano gli aggiornamenti apportati ai tipi proiettati, potrebbe verificarsi una perdita di dati nel servizio dati.Per ulteriori informazioni, vedere Considerazioni sulle proiezioni nella documentazione del client WCF Data Services.

Per ulteriori informazioni, vedere Procedura: proiettare i risultati delle query del servizio dati (client Silverlight).

Modifica di risorse e salvataggio di modifiche

Il client rileva le modifiche alle entità segnalate eseguendo manualmente i metodi seguenti in DataServiceContext.

Questi metodi consentono al client di rilevare le entità aggiunte ed eliminate, nonché le modifiche apportate ai valori delle proprietà o alle relazioni tra le istanze di entità. Quando si utilizza la finestra di dialogo Aggiungi riferimento al servizio per generare le classi del servizio dati client, viene inoltre creato un metodo AddTo per ogni entità nella classe DataServiceContext generata. Utilizzare questi metodi per aggiungere una nuova istanza di entità a un set di entità e riportare l'aggiunta nel contesto. Le modifiche rilevate vengono restituite al servizio dati in modo asincrono quando si chiamano i metodi BeginSaveChanges e EndSaveChanges.

Quando si aggiunge una nuova entità utilizzando il metodo AddObject o il metodo AddTo appropriato, eventuali relazioni tra la nuova entità e le entità correlate non verranno definite automaticamente. È possibile creare e modificare le relazioni tra istanze di entità e fare in modo che tali modifiche vengano apportate nel servizio dati mediante la libreria client. Le relazioni tra entità vengono definite come associazioni nel modello e l'oggetto DataServiceContext rileva ogni relazione come oggetto collegamento nel contesto. Per creare, modificare ed eliminare questi collegamenti, in WCF Data Services sono disponibili i metodi della classe DataServiceContext seguenti:

Per ulteriori informazioni, vedere Aggiornamento del servizio dati (WCF Data Services)

Utilizzo di dati binari

In OData viene definito un meccanismo per accedere ai dati binari separatamente da un'entità a cui appartengono. In questo modo un servizio OData può esporre dati binari di grandi dimensioni come risorsa multimediale appartenente a una voce di collegamento multimediale. Il client WCF Data Services per Silverlight può utilizzare una risorsa multimediale da un servizio OData come flusso binario. Per accedere al flusso binario, chiamare il metodo BeginGetReadStream nell'istanza DataServiceContext che rileva l'entità corrispondente alla voce di collegamento multimediale. Questo metodo asincrono restituisce un oggetto DataServiceStreamResponse se il metodo EndGetReadStream viene chiamato nell'istanza DataServiceContext restituita dal callback. In modo analogo, una risorsa multimediale viene inviata al servizio OData in caso di chiamata del metodo SetSaveStream e dopo aver chiamato i metodi BeginSaveChanges e EndSaveChanges. Per ulteriori informazioni, vedere Procedura: accedere a dati binari come flusso (client Silverlight).

Associazione dati

Il client WCF Data Services per Silverlight supporta l'associazione di dati a controlli mediante la classe DataServiceCollection<T>. Questa classe, che eredita da ObservableCollection<T>, rappresenta una raccolta di dati dinamica che fornisce notifiche in caso di aggiunta o rimozione di elementi dalla raccolta. Queste notifiche consentono il rilevamento automatico delle modifiche da parte di DataServiceContext senza dover chiamare in modo esplicito i metodi di rilevamento delle modifiche. Un oggetto DataServiceCollection<T> viene definito in base a un oggetto DataServiceQuery<TElement>. Se eseguita, questa query fornisce gli oggetti per la raccolta.

Il metodo LoadAsync viene utilizzato per eseguire in modo asincrono la query e caricare i risultati nella raccolta. Questo metodo garantisce che venga eseguito il marshalling dei risultati al thread corretto, evitando di dover utilizzare un oggetto Dispatcher. Quando si utilizza un'istanza di DataServiceCollection<T> per l'associazione dei dati, il client fa in modo che gli oggetti rilevati da DataServiceContext rimangano sincronizzati con i dati nell'elemento dell'interfaccia utente associato. Non è necessario segnalare manualmente le modifiche nelle entità di una raccolta di associazioni in DataServiceContext. Per ulteriori informazioni, vedere Procedura: associare dati del servizio dati a controlli (client Silverlight).

Esecuzione tra domini

Silverlight consente di accedere a servizi ospitati in un dominio separato. È necessario abilitare in modo esplicito questo tipo di accesso distribuendo un file di criteri tra domini nel server. Questa funzionalità è inclusa nell'implementazione HTTP del client Silverlight.

Nota

Prima di consentire ai client Silverlight di accedere ai servizi Web in una situazione tra domini, è opportuno analizzare alcune importanti considerazioni sulla sicurezza.Per ulteriori informazioni, vedere HTTP Communication and Security with Silverlight.

Per la maggior parte delle richieste a un servizio dati, il client WCF Data Services per Silverlight utilizza un'implementazione XMLHTTP. Se tuttavia il client WCF Data Services rileva una richiesta tra domini, utilizzerà automaticamente l'implementazione HTTP del client Silverlight.

Nota

Il client passerà automaticamente all'implementazione HTTP solo se la proprietà HttpStack è impostata su Auto.

Per un esempio sulla configurazione di un servizio dati per consentire richieste tra domini da un'applicazione basata su Silverlight, vedere il post Utilizzo del client Silverlight di ADO.NET Data Services in scenari tra domini e out-of-browser. Il supporto per l'esecuzione tra domini è una novità di Silverlight 4.

Esecuzione out-of-browser

È possibile configurare applicazioni basate su Silverlight per consentire agli utenti di installarle dalle pagine Web host ed eseguirle all'esterno del browser. Il client WCF Data Services per Silverlight supporta l'esecuzione out-of-browser. Se il client WCF Data Services rileva l'esecuzione di un'applicazione all'esterno del browser, utilizzerà automaticamente l'implementazione HTTP del client Silverlight. Si tratta dello stesso comportamento che si verifica con l'esecuzione tra domini, con la differenza che non è richiesto un file di criteri tra domini. Per ulteriori informazioni, vedere Out-of-Browser Support.

Autenticazione client

Per impostazione predefinita, il client WCF Data Services per Silverlight effettua richieste al servizio dati utilizzando le stesse credenziali client del Web browser e l'autenticazione viene gestita mediante il Web browser. Tuttavia, se l'accesso al servizio dati necessita di una richiesta tra domini o se l'applicazione Silverlight viene eseguita all'esterno del Web browser, è possibile specificare le credenziali fornite in fase di richiesta. In questi scenari il client utilizza automaticamente l'implementazione HTTP del client Silverlight per effettuare richieste e per l'autenticazione vengono utilizzate le credenziali predefinite. Se tuttavia la proprietà UseDefaultCredentials è impostata su false, il client utilizza l'oggetto ICredentials assegnato alla proprietà Credentials in fase di autenticazione con il servizio dati.

Avviso

Le credenziali utente devono essere richieste solo durante l'esecuzione e non devono essere memorizzate nella cache.Le credenziali devono essere archiviate sempre in modo protetto.

È inoltre possibile fornire credenziali richiedendo l'utilizzo da parte dell'applicazione dell'implementazione HTTP del client Silverlight. A tale scopo, è necessario impostare il valore della proprietà HttpStack su ClientHttp. Il codice illustrato di seguito garantisce che le credenziali raccolte dall'utente durante l'esecuzione vengano utilizzate in fase di accesso al servizio dati:

' Select the client HTTP stack and set the credentials.
context.HttpStack = HttpStack.ClientHttp
context.UseDefaultCredentials = False
context.Credentials = _
    New NetworkCredential(userName, password, domain)
// Select the client HTTP stack and set the credentials.
context.HttpStack = HttpStack.ClientHttp;
context.UseDefaultCredentials = false;
context.Credentials = 
    new NetworkCredential(userName, password, domain);

Se non viene utilizzata l'implementazione HTTP del client Silverlight, l'impostazione del valore della proprietà UseDefaultCredentials su false genererà un'eccezione in fase di esecuzione. Se il valore dell'oggetto UseDefaultCredentials è true, verranno utilizzate le credenziali predefinite anche se è impostata la proprietà Credentials.

Avviso

I dati inviati con l'autenticazione di base o digest non sono crittografati, pertanto possono essere visti da un avversario.Le credenziali di autenticazione di base (nome utente e password) vengono inoltre inviate in testo non crittografato e possono essere intercettate.

Per ulteriori informazioni, vedere Procedura: specificare le credenziali del client per una richiesta del servizio dati (client Silverlight). Per un esempio sull'accesso a un servizio dati che utilizza l'autenticazione basata su form ASP.NET da un'applicazione Silverlight, vedere l'articolo Utilizzo della libreria client Silverlight di ADO.NET Data Services in scenari tra domini e out-of-browser - II (autenticazione basata su form).