Questo argomento non è stato ancora valutato - Valuta questo argomento

Informazioni aggiuntive per OData in Windows Azure

Autore: Glenn Gailey

Revisore: Abhiram Chivukula

In questo articolo viene riepilogato l'utilizzo attuale di OData nella piattaforma Windows Azure. Vengono inoltre fornite informazioni aggiuntive per la creazione, la distribuzione e l'utilizzo dei servizi OData ospitati in Windows Azure.

In questo argomento sono incluse le seguenti sezioni di informazioni aggiuntive.

In questo articolo si presuppone che l'utente abbia acquisito familiarità con WCF Data Services e ADO.NET Entity Framework. Per ulteriori informazioni su queste tecnologie .NET Framework, vedere WCF Data Services e ADO.NET Entity Framework.

Panoramica: OData nel cloud

OData (Open Data Protocol) è un protocollo basato su REST (Representational State Transfer). Quando si creano servizi dati basati su cloud, i dati possono essere utilizzati da qualsiasi client in grado di supportare la messaggistica HTTP e di elaborare XML o JSON. OData espone i dati come risorse indirizzabili tramite URI. È possibile accedere ai dati e modificarli utilizzando i verbi HTTP standard GET, PUT, POST e DELETE. OData utilizza le convenzioni entità-relazione di Entity Data Model per esporre risorse come set di entità correlate mediante associazioni.

Essendo basato su standard Internet, OData costituisce una scelta naturale per creare nel cloud servizi dati basati su REST che vengono utilizzati da un'ampia gamma di dispositivi e piattaforme client compatibili con Internet. Per questo motivo OData viene utilizzato da molte funzionalità della piattaforma Windows Azure, incluse le seguenti:

Servizio Tabella del Servizio di archiviazione Windows Azure
L'interfaccia di programmazione utilizzata per accedere al servizio Tabella di Windows Azure è OData. È possibile accedere al servizio Tabella componendo manualmente richieste HTTP. Per ulteriori informazioni, vedere Table Service REST API. Per accedere al servizio Tabella è inoltre possibile utilizzare un client OData, ad esempio il client di Servizio di archiviazione Windows Azure o di WCF Data Services. Per ulteriori informazioni, vedere Using the .NET Client Library with the Table Service.

Windows Azure Marketplace
Windows Azure Marketplace è un marketplace basato su sottoscrizione in cui sono disponibili applicazioni e informazioni destinate a semplificare la pubblicazione e l'utilizzo di dati da varie origini. Nel marketplace i dati vengono pubblicati come feed OData per poter essere utilizzati facilmente nelle applicazioni compatibili con OData. Per ulteriori informazioni, vedere Windows Azure Marketplace.

Servizio di gestione ACS
Il Servizio di controllo di accesso di Windows Azure (ACS) 2.0 offre un'API basata su OData per il servizio di gestione ACS. Per ulteriori informazioni, vedere ACS Management Service API Reference.

È inoltre possibile creare e distribuire il servizio OData personalizzato in Windows Azure. In questo caso il servizio dati è un'applicazione Web basata su .NET Framework ospitata da un ruolo Web ASP.NET. Di seguito sono elencate le funzionalità e i toolkit che consentono di creare e distribuire servizi OData in Windows Azure:

WCF Data Services
WCF Data Services è un componente di .NET Framework utilizzato per creare applicazioni di tipo servizio dati che implementano OData. Per ulteriori informazioni, vedere WCF Data Services. WCF Data Services consente di creare servizi dati personalizzati basati su Windows Azure ospitati come ruoli Web ASP.NET. Tramite WCF Data Services è possibile esporre dati provenienti da varie origini di Windows Azure, ad esempio il database SQL e l'archiviazione BLOB di Windows Azure. Il provider di servizi dati utilizzato per definire il modello di dati del servizio dati dipende dall'origine dati. Per ulteriori informazioni, vedere Data Services Providers (WCF Data Services).

Gli strumenti di Windows Azure per Visual Studio includono un set integrato di strumenti per sviluppare servizi dati basati su Windows Azure in Visual Studio. Per un esempio della modalità di utilizzo degli strumenti di Visual Studio per creare e distribuire un servizio dati che esponga feed OData da un database SQL, vedere l'articolo relativo ai servizi dati nel cloud. Per informazioni aggiuntive generali sulla creazione e distribuzione di servizi OData tramite WCF Data Services, vedere Defining WCF Data Services.

Sync Framework Toolkit
Sync Framework Toolkit estende Microsoft Sync Framework per consentire la creazione di un servizio di sincronizzazione basato su WCF Data Services che può essere distribuito in Windows Azure. Questo servizio OData specializzato consente di sincronizzare dati tra un database SQL e molteplici applicazioni client e dispositivi in grado di utilizzare feed OData. Per ulteriori informazioni, vedere la pagina relativa al progetto Microsoft Sync Framework Toolkit nella sezione relativa agli esempi di codice del sito MSDN.

Per ulteriori informazioni generali relative al protocollo OData, incluso un elenco di producer e consumer OData e di librerie client che supportano OData, vedere il sito Web OData.org.

Informazioni aggiuntive sull'utilizzo di un provider Entity Framework per connettersi a un database SQL

È possibile utilizzare il provider Entity Framework in WCF Data Services per creare un servizio dati da utilizzare per la pubblicazione di dati del database SQL come feed OData. Per un esempio, vedere How to: Connect to Windows Azure SQL Database Through WCF Data Services. Quando si utilizza il provider Entity Framework per definire il modello di dati per il servizio dati, in WCF Data Services viene utilizzata la classe specificata, che eredita da ObjectContext, per creare ed eseguire query sul database. Per ulteriori informazioni, vedere Entity Framework Provider (WCF Data Services).

Le seguenti linee guida si applicano in caso di utilizzo del provider Entity Framework per consentire a WCF Data Services di pubblicare dati da un database SQL.

Utilizzo di un provider Code First di Entity Framework

ADO.NET Entity Framework consente di definire un modello di dati tramite una finestra di progettazione (Model First), eseguendo il mapping a un database esistente (Database First) e utilizzando oggetti Common Language Runtime (CLR) (Code First). Per ulteriori informazioni, vedere Creating and Mapping a Conceptual Model (Entity Framework). Code First è stato introdotto in Entity Framework 4.1. Come l'approccio Model First, Code First consente di definire un modello di dati senza che esista un database SQL. Code First genera automaticamente un nuovo database SQL nel server di database SQL di destinazione. Nell'esercitazione relativa allo sviluppo di un'applicazione dati di Windows Azure utilizzando Code First e il database SQL di Windows Azure viene illustrato come creare un modello di dati Code First per un database SQL.

Quando si utilizza Code First per definire il modello di dati, si definisce una classe del contesto che eredita da DbContext anziché da ObjectContext. Tuttavia, in caso di utilizzo del provider Entity Framework con WCF Data Services, la classe DataService deve essere di un tipo che eredita da ObjectContext. Esiste una soluzione alternativa che consente di utilizzare un modello di dati Code First con WCF Data Services. È necessario eseguire l'override di CreateDataSource per fornire in modo esplicito la classe ObjectContext sottostante al runtime di Data Services. Per un esempio di come effettuare questa operazione, vedere l'articolo relativo all'utilizzo di Code First in Entity Framework 4.1 con WCF Data Services.

Riduzione degli errori di connessione al database SQL

Quando si utilizza Entity Framework per accedere ai dati in un database SQL, è opportuno tentare di ridurre gli errori di connessione. Come descritto nell'articolo relativo alla gestione degli errori di connessione del database SQL di Windows Azure e di Entity Framework, sono disponibili vari modi per ridurre gli errori di connessione del database SQL quando si utilizza Entity Framework. Attualmente non è disponibile un meccanismo automatico di ripetizione tentativi in Entity Framework o WCF Data Services. In caso di utilizzo del provider Entity Framework, la classe ObjectContext viene gestita automaticamente da WCF Data Services. Ciò significa che non è disponibile alcun modo per inserire la logica di ripetizione tentativi nelle singole operazioni di Entity Framework. Per questo motivo è invece necessario implementare la logica di ripetizione tentativi per cancellare dal pool di connessioni qualsiasi connessione non valida che potrebbe causare errori durante l'esecuzione.

Se si dispone di un modello Database First o Model First

Se si utilizzano gli strumenti di Entity Framework per creare un modello Database First o Model First, viene generata automaticamente una ObjectContext fortemente tipizzata come classe parziale. Questa classe parziale include un metodo OnContextCreated parziale.

Per ridurre gli errori di connessione, implementare il metodo seguente in una tabella codici separata nel progetto di servizio dati:

partial void OnContextCreated()
{
    int MaxRetries = 10; 
    int DelayMS = 100; 
    RetryPolicy policy = 
        new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(
            MaxRetries, TimeSpan.FromMilliseconds(DelayMS)); 

    // Invoke the query in an inline delegate using the lambda operator.
    policy.ExecuteAction(() =>
    {
        try
        {
            // Try to open the connection.
            Connection.Open();
            var storeConnection = 
            (SqlConnection)((EntityConnection)Connection)
            .StoreConnection;

            // Send a quick query to the SQL database to test the connection.
            new SqlCommand("declare @i int", storeConnection).ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            // If we fail, close the connection.
            Connection.Close(); 
            throw ex;
         }
      });
}

Questo metodo introduce la logica di ripetizione tentativi quando viene creato il contesto per inviare query con costo ridotto al database SQL per cancellare il pool di connessioni. La logica di ripetizione tentativi viene fornita dalla classe RetryPolicy tramite Transient Fault Handling Application Block, incluso in Enterprise Library 5.0 Integration Pack for Windows Azure di novembre 2011. Questo blocco applicazione è disponibile anche come pacchetto NuGet. L'esempio di codice precedente richiede le seguenti istruzioni using:

using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure;
using Microsoft.Practices.TransientFaultHandling;
using System.Data.EntityClient;
using System.Data.SqlClient;

Se si dispone di un modello Code First

Se si utilizza Code First per definire un modello dei dati di Entity Framework, è necessario eseguire l'override di CreateDataSource per fornire in modo esplicito la classe ObjectContext sottostante al runtime di Data Services. Per ulteriori informazioni, vedere l'articolo relativo all'utilizzo di Code First in Entity Framework 4.1 con WCF Data Services. Per un servizio dati basato su un modello di dati Code First, eseguire un'operazione di ripetizione tentativi analoga nel metodo che esegue l'override del metodo CreateDataSource. Di seguito è riportato l'override del metodo per un modello di dati Code First basato su Northwind:

// You must override CreateDataSource to manually return an ObjectContext,
// otherwise the runtime tries to use the built-in reflection provider instead of 
// the Entity Framework provider.
protected override ObjectContext CreateDataSource()
{
    // Create a new Code First Northwind DbContext.
    NorthwindContext nw = new NorthwindContext();
    nw.Configuration.ProxyCreationEnabled = false;
    
    // Define a retry policy for our query to the SQL database.
    int MaxRetries = 10;
    int DelayMS = 100;
    RetryPolicy policy =
        new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(
            MaxRetries, TimeSpan.FromMilliseconds(DelayMS));

    
    // Invoke the query in an inline delegate using the lambda operator.
    policy.ExecuteAction(() =>
    {
        try
        {
            // Try to open the connection.
            nw.Database.Connection.Open();
            var storeConnection = (SqlConnection)(nw.Database.Connection);

            // Send a quick query to the SQL database to test the connection.
            new SqlCommand("declare @i int", storeConnection).ExecuteNonQuery(); 
        }
        catch (Exception ex)
        {
            // If we fail, close the connection.
            nw.Database.Connection.Close();
            throw ex;
         }
    });

    // Configure DbContext before we provide it to the 
    // data services runtime.
    nw.Configuration.ValidateOnSaveEnabled = false;

    // Get the underlying ObjectContext for the DbContext.
    var context = ((IObjectContextAdapter)nw).ObjectContext;

    // Return the underlying context.
    return context;
}

Come nell'esempio precedente, in questo codice viene utilizzata la classe RetryPolicy in Transient Fault Handling Application Block.

Utilizzo dell'archiviazione BLOB

Un servizio OData può esporre dati BLOB (Binary Large Object). Open Data Protocol (OData) definisce un meccanismo per recuperare dati binari indipendentemente dell'entità a cui appartengono. Questa operazione viene eseguita mediante la separazione dei dati binari dall'entità in un flusso dei dati distinto. Con WCF Data Services è possibile definire un flusso di risorse binarie implementando l'interfaccia IDataServiceStreamProvider per definire un provider di dati di flusso. L'implementazione del provider di flusso fornisce il servizio dati con il flusso associato a un'entità specifica come oggetto Stream o come URI utilizzato per accedere ai dati binari. Per ulteriori informazioni, vedere Streaming Provider (WCF Data Services).

Quando si crea un provider del servizio dati di flusso per un servizio dati ospitato in Windows Azure, utilizzare il servizio BLOB di Windows Azure in caso di implementazione di GetWriteStream e GetReadStream. Per ottenere le migliori prestazioni, l'implementazione di GetReadStreamUri dovrà restituire l'URI del BLOB in modo che i client possano richiederlo direttamente al servizio BLOB.

Protezione di un servizio OData

In alcuni scenari è consigliabile pubblicare un servizio OData basato su Windows Azure che consente l'accesso anonimo. In molti casi è tuttavia necessario determinare chi accede al servizio dati. In termini di sicurezza, questa definizione di "chi" è nota come principio. È inoltre necessario determinare se un dato principio può accedere alle risorse e (potenzialmente) filtrare i risultati delle query in base al principio che effettua la richiesta. Può anche essere necessario proteggere i dati restituiti dal servizio dati per impedire che vengano rivelati a terze parti. Per informazioni generali sulla protezione di WCF Data Services, vedere Securing WCF Data Services.

Autenticazione
WCF Data Services non esegue l'autenticazione delle richieste client. Al contrario, si basa sulla piattaforma di hosting per eseguire l'autenticazione e fornire informazioni sul principio richiedente. Quando si implementa l'autenticazione per un servizio dati ospitato in Windows Azure, è consigliabile utilizzare l'autenticazione OAuth 2.0. Nella piattaforma Windows Azure il supporto per questo schema di autenticazione è fornito dal Servizio di controllo di accesso (ACS). Per un esempio della modalità di utilizzo di ACS per implementare l'autenticazione OAuth 2.0 per il servizio dati in uso, vedere l'articolo relativo a OData e OAuth: protezione di un servizio OData tramite OAuth 2.0.

Per un esempio della modalità di connessione a un servizio OData tramite OAuth 2.0, vedere l'articolo relativo alla connessione a un servizio dati OData protetto tramite OAuth 2.0.

Autorizzazione
Si consiglia di definire regole che limitino l'accesso alle risorse del modello di dati al set minimo di privilegi richiesti per il supporto di applicazioni client. Per ulteriori informazioni, vedere Configuring the Data Service (WCF Data Services). Dopo che un client è stato autenticato, è possibile ottenere informazioni, ad esempio un nome utente, dall'identità del principio. A seconda del modello di dati, queste informazioni specifiche del client possono essere utilizzate per filtrare i dati prima che vengano restituiti al client dal servizio dati. È possibile effettuare questa operazione definendo intercettori di query per gli specifici set di entità che è necessario filtrare. Per ulteriori informazioni, vedere Interceptors (WCF Data Services).

La definizione di intercettori di query che restituiscono solo dati appartenenti a un principio o ruolo specifico consente a WCF Data Services di supportare applicazioni multi-tenant. Nel modello multi-tenant un solo servizio dati può servire molti client mantenendone i dati separati. Per informazioni aggiuntive sulla creazione di applicazioni multi-tenant basate su Windows Azure, vedere Progettazione di applicazioni multi-tenant in Windows Azure. È inoltre possibile definire intercettori di modifiche per l'inserimento della logica di business quando una modifica viene inviata al servizio dati. Questa logica può controllare anche il principio della richiesta autenticata e, potenzialmente, eseguire il rollback delle modifiche eseguite da un utente che non dispone di tale autorizzazione.

Ripubblicazione del servizio Tabella non consigliata

La classe TableServiceContext, utilizzata per accedere al servizio Tabella di Windows Azure, è basata sul client di WCF Data Services. È possibile ripubblicare i feed OData del servizio Tabella tramite il provider di reflection con TableServiceContext. La libreria client di WCF Data Services non supporta tuttavia il set completo di query LINQ (Language Integrated Query) utilizzate da un servizio OData. Per questo motivo, non è consigliato ripubblicare il servizio Tabella tramite WCF Data Services.

Informazioni aggiuntive sul miglioramento delle applicazioni di WCF Data Services

In questa sezione vengono fornite informazioni aggiuntive su WCF Data Services ospitato in Windows Azure, che è possibile utilizzare per offrire un'esperienza migliore ai client che accedono a un servizio OData.

Definire i limiti della pagina per i set di entità estesi
Quando si utilizza WCF Data Services per esporre set di dati di grandi dimensioni, è consigliabile impostare i limiti della pagina per ridurre il numero di entità restituito ai client in una singola query. Senza questi limiti, alcuni client potrebbero facilmente utilizzare una quantità eccessiva di risorse eseguendo semplici richieste su feed contenenti molte entità. I limiti della pagina consentono di suddividere query di grandi dimensioni in un numero di query parziali più piccole, riducendo l'impatto che le query di grandi dimensioni possono avere sui tempi di risposta complessivi del sistema. Per impostare i limiti della pagina, chiamare il metodo SetEntitySetPageSize su ogni set di entità esposto dal servizio dati. Per ulteriori informazioni, vedere How to: Enable Paging of Data Service Results (WCF Data Services).

Abilitare l'opzione query di sistema $format in WCF Data Services
WCF Data Services supporta sia Atom XML che JSON, come richiesto da OData. Quando WCF Data Services riceve una richiesta, controlla l'intestazione Accept della richiesta per determinare il formato della risposta. OData offre inoltre un'opzione query $format utilizzabile utilizzata dai client che non sono in grado di impostare intestazioni delle richieste, ad esempio il browser e alcuni client JavaScript. Per impostazione predefinita, WCF Data Services ignora questa opzione query di sistema. Per ulteriori informazioni, vedere WCF Data Services Protocol Implementation Details.

Abilitando il supporto per l'opzione query $format, viene abilitato anche il supporto per JSONP (JavaScript Object Notation with Padding) nel codice della pagina Web JavaScript sul lato client quando si chiama un servizio OData. È possibile aggiungere questa funzionalità al servizio dati in uso. A tale scopo, scaricare il progetto di esempio per il supporto del formato JSONP e basato su URL per WCF Data Services nella sezione relativa agli esempi di codice del sito Web MSDN e aggiungerlo quindi al progetto di servizio dati.

Informazioni aggiuntive sui client OData

In questa sezione viene descritto il livello di supporto dei client per l'accesso ai servizi OData e vengono fornite informazioni aggiuntive per i client che accedono a un servizio OData.

Supporto dei client per l'accesso ai servizi OData
Poiché OData è basato su protocolli Internet standard, l'accesso a un servizio OData è consentito a qualsiasi client in grado di inviare e ricevere messaggi HTTP e di comporre e analizzare XML o JSON. Per ridurre la quantità di lavoro richiesta per accedere a un servizio OData, sono disponibili diverse librerie e applicazioni client che consentono di utilizzare servizi OData, incluse le seguenti:

Per un elenco completo delle librerie client per OData, vedere l'SDK OData. Per un elenco di applicazioni che utilizzano feed OData, vedere la pagina relativa ai consumer sul sito Web OData.

Considerazioni sui client mobili
Le considerazioni riportate di seguito si applicano in caso di accesso ai feed OData da un'applicazione per dispositivi mobili:

  • Abilitare sempre il paging sul lato client, in modo che il client abbia il controllo della quantità di dati inviati dal servizio. A questo scopo, utilizzare le opzioni query $skip e $top nell'URI della richiesta.

  • Essere sempre pronti a gestire una risposta dal server di cui è stato eseguito il paging. In WCF Data Services la pagina successiva viene richiesta tramite l'opzione query $skiptoken nell'URI di una query. Per ulteriori informazioni, vedere How to: Load Paged Results (WCF Data Services).

  • Se è necessario solo un conteggio del numero di elementi nel feed, richiedere solo il valore del conteggio e non l'intero feed. Questo conteggio può essere effettuato richiedendo l'endpoint $count o includendo $inlinecount=allpages nell'URI della richiesta. Per ulteriori informazioni, vedere How to: Determine the Number of Entities Returned by a Query (WCF Data Services).

  • Si consideri la possibilità di utilizzare il formato di JSON anziché Atom XML per ridurre la larghezza di banda della rete.

    noteNota
    I client di WCF Data Services, incluso OData client for Windows Phone, non supportano attualmente il formato JSON.

  • Si consiglia di utilizzare la funzionalità di compressione per ridurre la larghezza di banda della rete. La compressione richiede un'attività di elaborazione aggiuntiva, sia da parte del servizio dati che del dispositivo client, con un possibile impatto negativo sulla durata della batteria del dispositivo.

  • Per ridurre la quantità di dati inviata al client, si consideri la possibilità di adottare strategie come le proiezioni client che utilizzano l'opzione query $select. Per ulteriori informazioni, vedere Query Projections (WCF Data Services).

  • Memorizzare nella cache del client i dati di riferimento o implementare un'altra strategia di sincronizzazione per ridurre la quantità di dati sovrapposti scaricati dal servizio dati. Per ulteriori informazioni, vedere Sincronizzazione dei dati tra Windows Azure e client Mobili.

Per informazioni aggiuntive specifiche della piattaforma Windows Phone, vedere Utilizzo di Windows Phone con Windows Azure.


Data di compilazione:

2013-06-12
Il documento è risultato utile?
(1500 caratteri rimanenti)

Aggiunte alla community

AGGIUNGI
© 2013 Microsoft. Tutti i diritti riservati.
facebook page visit twitter rss feed newsletter