Provider di flusso (WCF Data Services)Streaming Provider (WCF Data Services)

Un servizio dati può esporre dati Large Object Binary.A data service can expose large object binary data. Tali dati binari possono rappresentare flussi audio e video, immagini, file documento o altri tipi di elementi multimediali binari.This binary data might represent video and audio streams, images, document files, or other types of binary media. Quando un'entità del modello di dati include una o più proprietà binarie, il servizio dati restituisce tali dati binari codificati in base 64 all'interno dell'elemento entry presente nel feed di risposta.When an entity in the data model includes one or more binary properties, the data service returns this binary data encoded as base-64 inside the entry in the response feed. Poiché il caricamento e la serializzazione di dati binari di grandi dimensioni in questo modo può influire sulle prestazioni, la Protocollo OData (Open Data)Open Data Protocol (OData) definisce un meccanismo per recuperare dati binari indipendentemente dell'entità a cui appartiene.Because loading and serializing large binary data in this manner can affect performance, the Protocollo OData (Open Data)Open Data Protocol (OData) defines a mechanism for retrieving binary data independent of the entity to which it belongs. Questa operazione viene eseguita separando i dati binari dall'entità in uno o più flussi di dati.This is accomplished by separating the binary data from the entity into one or more data streams.

  • Risorsa multimediale: dati binari che appartengono a un'entità, quali una risorsa video, audio, immagine o altri tipi di flusso di risorse multimediali.Media resource - binary data that belongs to an entity, such as a video, audio, image or other type of media resource stream.

  • Elemento entry di collegamento multimediale: entità che presenta un riferimento a un flusso di risorse multimediali correlato.Media link entry - an entity that has a reference to a related media resource stream.

Con WCF Data ServicesWCF Data Services si definisce un flusso di risorse binarie implementando un provider di dati di flusso.With WCF Data ServicesWCF Data Services, you define a binary resource stream by implementing a streaming data provider. L'implementazione del provider di flusso fornisce al servizio dati con il flusso di risorsa multimediale associato a un'entità specifica come un Stream oggetto.The streaming provider implementation supplies the data service with the media resource stream associated with a specific entity as an Stream object. Questa implementazione consente al servizio dati di accettare e restituire risorse multimediali tramite HTTP sotto forma di flussi di dati binari di un tipo MIME specificato.This implementation enables the data service to accept and return media resources over HTTP as binary data streams of a specified MIME type.

La configurazione di un servizio dati per supportare il flusso di dati binari richiede l'esecuzione dei passaggi seguenti:Configuring a data service to support the streaming of binary data requires the following steps:

  1. Assegnare una o più entità del modello di dati come entry di collegamento multimediale.Attribute one or more entities in the data model as a media link entry. Queste entità non devono includere dati binari da trasmettere.These entities should not include the binary data to be streamed. Qualsiasi proprietà binaria di un'entità viene sempre restituita nell'elemento entry sotto forma di dati binari codificati in base 64.Any binary properties of an entity are always returned in the entry as base-64 encoded binary.

  2. Implementare l'interfaccia T:System.Data.Services.Providers.IDataServiceStreamProvider.Implement the T:System.Data.Services.Providers.IDataServiceStreamProvider interface.

  3. Definire un servizio dati che implementi l'interfaccia IServiceProvider.Define a data service that implements the IServiceProvider interface. Il servizio dati usa l'implementazione GetService per accedere all'implementazione del provider di dati di flusso.The data service uses the GetService implementation to access the streaming data provider implementation. Questo metodo restituisce l'implementazione del provider di flusso appropriata.This method returns the appropriate streaming provider implementation.

  4. Abilitare flussi di messaggi di grandi dimensioni nella configurazione dell'applicazione Web.Enable large message streams in the Web application configuration.

  5. Abilitare accesso alle risorse binarie sul server o in un'origine dati.Enable access to binary resources on the server or in a data source.

Gli esempi in questo argomento sono basati su un campione di servizio di foto, come illustrato in dettaglio nel post di streaming serie Provider di flusso di dati Services: implementazione di un Provider di flusso (parte 1).The examples in this topic are based on a sample streaming photo service, which is discussed in depth in the post Data Services Streaming Provider Series: Implementing a Streaming Provider (Part 1). Il codice sorgente per questo servizio di esempio è disponibile il pagina di esempio di servizio dati foto di flusso in MSDN Code Gallery.The source code for this sample service is available on the Streaming Photo Data Service Sample page on MSDN Code Gallery.

Definizione di un elemento entry di collegamento multimediale nel modello di datiDefining a Media Link Entry in the Data Model

Il provider dell'origine dati determina la modalità di definizione di un'entità come entry di collegamento multimediale nel modello di dati.The data source provider determines the way that an entity is defined as a media link entry in the data model.

Provider di Entity FrameworkEntity Framework Provider
Per indicare che un'entità è un elemento entry di collegamento multimediale, aggiungere l'attributo HasStream alla definizione del tipo di entità nel modello concettuale, come nell'esempio seguente:To indicate that an entity is a media link entry, add the HasStream attribute to the entity type definition in the conceptual model, as in the following example:

<EntityType xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
            Name="PhotoInfo" m:HasStream="true">
  <Key>
    <PropertyRef Name="PhotoId" />
  </Key>
  <Property Name="PhotoId" Type="Int32" Nullable="false" 
            annotation:StoreGeneratedPattern="Identity" />
  <Property Name="FileName" Type="String" Nullable="false" />
  <Property Name="FileSize" Type="Int32" Nullable="true" />
  <Property Name="DateTaken" Type="DateTime" Nullable="true" />
  <Property Name="TakenBy" Type="String" Nullable="true" />
  <Property Name="DateAdded" Type="DateTime" Nullable="false" />
  <Property Name="Exposure" Type="PhotoData.Exposure" Nullable="false" />
  <Property Name="Dimensions" Type="PhotoData.Dimensions" Nullable="false" />
  <Property Name="DateModified" Type="DateTime" Nullable="false" />
  <Property Name="Comments" Type="String" MaxLength="Max" 
            FixedLength="false" Unicode="true" />
  <Property Name="ContentType" Type="String" MaxLength="50" FixedLength="false" Unicode="true" />
</EntityType>

È inoltre necessario aggiungere lo spazio dei nomi xmlns:m=http://schemas.microsoft.com/ado/2007/08/dataservices/metadata all'entità o alla radice del file con estensione edmx o csdl che definisce il modello di dati.You must also add the namespace xmlns:m=http://schemas.microsoft.com/ado/2007/08/dataservices/metadata either to the entity or to the root of the .edmx or .csdl file that defines the data model.

Per un esempio di un servizio dati che utilizza il Entity FrameworkEntity Framework provider ed espone una risorsa multimediale, vedere il post serie Provider di flusso di dati Services: implementazione di un Provider di flusso (parte 1).For an example of a data service that uses the Entity FrameworkEntity Framework provider and exposes a media resource, see the post Data Services Streaming Provider Series: Implementing a Streaming Provider (Part 1).

Provider di reflectionReflection Provider
Per indicare che un'entità è un elemento entry di collegamento multimediale, aggiungere HasStreamAttribute alla classe che definisce il tipo di entità nel provider di reflection.To indicate that an entity is a media link entry, add the HasStreamAttribute to the class that defines the entity type in the reflection provider.

Provider del servizio dati personalizzatoCustom Data Service Provider
Quando si usano provider di servizi personalizzati, si implementa l'interfaccia IDataServiceMetadataProvider per definire i metadati per il servizio dati.When using custom service providers, you implement the IDataServiceMetadataProvider interface to define the metadata for your data service. Per ulteriori informazioni, vedere provider di servizi dati personalizzati.For more information, see Custom Data Service Providers. Si indica che un flusso di risorse binarie appartiene a un oggetto ResourceType impostando la proprietà IsMediaLinkEntry su true nell'oggetto ResourceType che rappresenta il tipo di entità, un elemento entry di collegamento multimediale.You indicate that a binary resource stream belongs to a ResourceType by setting the IsMediaLinkEntry property to true on the ResourceType that represents the entity type, which is a media link entry.

Implementazione dell'interfaccia IDataServiceStreamProviderImplementing the IDataServiceStreamProvider Interface

Per creare un servizio dati che supporta i flussi di dati binari, è necessario implementare l'interfaccia IDataServiceStreamProvider.To create a data service that supports binary data streams, you must implement the IDataServiceStreamProvider interface. Questa implementazione consente al servizio dati di restituire al client i dati binari sotto forma di flusso e di usarli come flusso inviato dal client.This implementation enables the data service to return binary data as a stream to the client and consume binary data as a stream sent from the client. Il servizio dati crea un'istanza di questa interfaccia ogni volta che deve accedere ai dati binari sotto forma di flusso.The data service creates an instance of this interface whenever it needs to access binary data as a stream. L'interfaccia IDataServiceStreamProvider specifica i membri seguenti:The IDataServiceStreamProvider interface specifies the following members:

Nome del membroMember name DescrizioneDescription
DeleteStream Questo metodo viene richiamato dal servizio dati per eliminare la risorsa multimediale corrispondente quando viene eliminato l'elemento entry di collegamento multimediale.This method is invoked by the data service to delete the corresponding media resource when its media link entry is deleted. Quando si implementa IDataServiceStreamProvider, questo metodo contiene il codice che elimina la risorsa multimediale associata all'elemento entry di collegamento multimediale fornito.When you implement IDataServiceStreamProvider, this method contains the code that deletes the media resource associated with the supplied media link entry.
GetReadStream Questo metodo viene richiamato dal servizio dati per restituire una risorsa multimediale come flusso.This method is invoked by the data service to return a media resource as a stream. Quando si implementa IDataServiceStreamProvider, questo metodo contiene il codice che fornisce un flusso usato dal servizio dati per restituire la risorsa multimediale associata all'elemento entry di collegamento multimediale specifico.When you implement IDataServiceStreamProvider, this method contains the code that provides a stream that is used by the data service to the return media resource that is associated with the provided media link entry.
GetReadStreamUri Questo metodo viene richiamato dal servizio dati per restituire l'URI usato per richiedere la risorsa multimediale relativa all'elemento entry di collegamento multimediale.This method is invoked by the data service to return the URI that is used to request the media resource for the media link entry. Questo valore consente di creare l'attributo src nell'elemento di contenuto dell'entry di collegamento multimediale che viene usato per richiedere il flusso di dati.This value is used to create the src attribute in the content element of the media link entry and that is used to request the data stream. Quando questo metodo restituisce null, il servizio dati determina automaticamente l'URI.When this method returns null, the data service automatically determines the URI. Usare questo metodo quando è necessario fornire ai client accesso diretto ai dati binari senza usare il provider di flusso.Use this method when you need to provide clients with direct access to binary data without using the steam provider.
GetStreamContentType Questo metodo viene richiamato dal servizio dati per restituire il valore Content-Type della risorsa multimediale associata all'elemento entry di collegamento multimediale specificato.This method is invoked by the data service to return the Content-Type value of the media resource that is associated with the specified media link entry.
GetStreamETag Questo metodo viene richiamato dal servizio dati per restituire il valore eTag del flusso di dati associato all'entità specificataThis method is invoked by the data service to return the eTag of the data stream that is associated with the specified entity. e viene usato per gestire la concorrenza dei dati binari.This method is used when you manage concurrency for the binary data. Quando questo metodo restituisce Null, il servizio dati non rileva la concorrenza.When this method returns null, the data service does not track concurrency.
GetWriteStream Questo metodo viene richiamato dal servizio dati per ottenere il flusso usato per la ricezione del flusso inviato dal client.This method is invoked by the data service to obtain the stream that is used when receiving the stream sent from the client. Quando si implementa IDataServiceStreamProvider, è necessario restituire un flusso scrivibile nel quale il servizio dati possa scrivere i dati del flusso ricevuti.When you implement IDataServiceStreamProvider, you must return a writable stream to which the data service writes received stream data.
ResolveType Restituisce un nome di tipo completo con lo spazio dei nomi che rappresenta il tipo che il runtime del servizio dati deve creare per l'elemento entry di collegamento multimediale associato al flusso di dati della risorsa multimediale inserita.Returns a namespace-qualified type name that represents the type that the data service runtime must create for the media link entry that is associated with the data stream for the media resource that is being inserted.

Creazione del servizio dati di flussoCreating the Streaming Data Service

Per fornire al runtime di WCF Data ServicesWCF Data Services l'accesso all'implementazione IDataServiceStreamProvider, il servizio dati creato deve implementare anche l'interfaccia IServiceProvider.To provide the WCF Data ServicesWCF Data Services runtime with access to the IDataServiceStreamProvider implementation, the data service that you create must also implement the IServiceProvider interface. Nell'esempio seguente viene illustrato come implementare il metodo GetService per restituire un'istanza della classe PhotoServiceStreamProvider che implementa IDataServiceStreamProvider.The following example shows how to implement the GetService method to return an instance of the PhotoServiceStreamProvider class that implements IDataServiceStreamProvider.

public partial class PhotoData : DataService<PhotoDataContainer>, IServiceProvider
{
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("PhotoInfo",
            EntitySetRights.ReadMultiple |
            EntitySetRights.ReadSingle |
            EntitySetRights.AllWrite);

        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    }
    public object GetService(Type serviceType)
    {
        if (serviceType == typeof(IDataServiceStreamProvider))
        {
            // Return the stream provider to the data service.
            return new PhotoServiceStreamProvider(this.CurrentDataSource);
        }
        
        return null;
    }
}
Partial Public Class PhotoData
    Inherits DataService(Of PhotoDataContainer)
    Implements IServiceProvider

    ' This method is called only once to initialize service-wide policies.
    Public Shared Sub InitializeService(ByVal config As DataServiceConfiguration)
        config.SetEntitySetAccessRule("PhotoInfo", _
            EntitySetRights.ReadMultiple Or _
            EntitySetRights.ReadSingle Or _
            EntitySetRights.AllWrite)

        ' Named streams require version 3 of the OData protocol.
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3
    End Sub
#Region "IServiceProvider Members"
    Public Function GetService(ByVal serviceType As Type) As Object _
    Implements IServiceProvider.GetService
        If serviceType Is GetType(IDataServiceStreamProvider) _
            Or serviceType Is GetType(IDataServiceStreamProvider) Then
            Return New PhotoServiceStreamProvider(Me.CurrentDataSource)
        End If
        Return Nothing
    End Function
#End Region
End Class

Per informazioni generali su come creare un servizio dati, vedere configurazione del servizio dati.For general information about how to create a data service, see Configuring the Data Service.

Abilitazione dei flussi binari di grandi dimensioni nell'ambiente di hostingEnabling Large Binary Streams in the Hosting Environment

Quando si crea un servizio dati in un'applicazione Web ASP.NETASP.NET, Windows Communication Foundation (WCF) viene utilizzato per fornire l'implementazione del protocollo HTTP.When you create a data service in an ASP.NETASP.NET Web application, Windows Communication Foundation (WCF) is used to provide the HTTP protocol implementation. Per impostazione predefinita, WCF limita la dimensione dei messaggi HTTP a soli 65.000 byte.By default, WCF limits the size of HTTP messages to only 65K bytes. Per consentire il flusso dei dati binari di grandi dimensioni verso e dal servizio dati, è inoltre necessario configurare l'applicazione Web per l'abilitazione di file binari di grandi dimensioni e l'uso di flussi per il trasferimento.To be able to stream large binary data to and from the data service, you must also configure the Web application to enable large binary files and to use streams for transfer. A tal fine, aggiungere quanto segue all'elemento <configuration /> del file Web.config dell'applicazione:To do this, add the following in the <configuration /> element of the application's Web.config file:

Nota

È necessario utilizzare un TransferMode.Streamed modalità di trasferimento per garantire che i dati binari nei messaggi di richiesta e risposta vengono trasmessi e non memorizzato nel buffer da WCF.You must use a TransferMode.Streamed transfer mode to ensure that the binary data in both the request and response messages are streamed and not buffered by WCF.

Per ulteriori informazioni, vedere Streaming di trasferimento messaggi e delle quote del trasporto.For more information, see Streaming Message Transfer and Transport Quotas.

Per impostazione predefinita, Internet Information Services (IIS) consente anche di limitare la dimensione delle richieste a 4 MB.By default, Internet Information Services (IIS) also limits the size of requests to 4MB. Per abilitare il servizio dati per la ricezione di flussi di dimensioni superiori a 4MB durante l'esecuzione in IIS, è necessario impostare anche la maxRequestLength attributo del elemento httpRuntime (Schema delle impostazioni ASP.NET) nel <system.web /> sezione di configurazione, come Nell'esempio seguente:To enable your data service to receive streams larger than 4MB when running on IIS, you must also set the maxRequestLength attribute of the httpRuntime Element (ASP.NET Settings Schema) in the <system.web /> configuration section, as shown in the following example:

Utilizzo dei flussi di dati in un'applicazione clientUsing Data Streams in a Client Application

La libreria client WCF Data ServicesWCF Data Services consente di recuperare e aggiornare tali risorse esposte come flussi binari sul client.The WCF Data ServicesWCF Data Services client library enables you to both retrieve and update these exposed resources as binary streams on the client. Per ulteriori informazioni, vedere funziona con dati binari.For more information, see Working with Binary Data.

Considerazioni sull'utilizzo di un provider di flussoConsiderations for Working with a Streaming Provider

Quando si implementa un provider di flusso e si accede alle risorse multimediali da un servizio dati, è necessario tenere presente le considerazioni seguenti.The following are things to consider when you implement a streaming provider and when you access media resources from a data service.

  • Le richieste MERGE non sono supportate per le risorse multimediali.MERGE requests are not supported for media resources. Usare una richiesta PUT per modificare la risorsa multimediale di un'entità esistente.Use a PUT request to change the media resource of an existing entity.

  • Non è possibile usare una richiesta POST per creare un nuovo elemento entry di collegamento multimediale.A POST request cannot be used to create a new media link entry. È invece necessario inviare una richiesta POST per creare una nuova risorsa multimediale. Il servizio dati crea un nuovo elemento entry di collegamento multimediale con i valori predefiniti.Instead, you must issue a POST request to create a new media resource, and the data service creates a new media link entry with default values. Questa nuova entità può essere aggiornata da una richiesta MERGE o PUT successiva.This new entity can be updated by a subsequent MERGE or PUT request. È anche possibile memorizzare l'entità nella cache ed eseguire nell'elemento di eliminazione aggiornamenti, quale l'impostazione del valore della proprietà sul valore dell'intestazione Slug nella richiesta POST.You may also consider caching the entity and make updates in the disposer, such as setting the property value to the value of the Slug header in the POST request.

  • Quando viene ricevuta una richiesta POST, il servizio dati chiama GetWriteStream per creare la risorsa multimediale prima di chiamare SaveChanges per creare l'elemento entry di collegamento multimediale.When a POST request is received, the data service calls GetWriteStream to create the media resource before it calls SaveChanges to create the media link entry.

  • Un'implementazione di GetWriteStream non deve restituire un oggetto MemoryStream.An implementation of GetWriteStream should not return a MemoryStream object. Quando si usa questo tipo di flusso, si verificano problemi nelle risorse di memoria alla ricezione di flussi di dati di dimensioni molto elevate da parte del servizio.When you use this kind of stream, memory resource issues will occur when the service receives very large data streams.

  • Quando si archiviano le risorse multimediali in un database, occorre tenere presente le seguenti considerazioni.The following are things to consider when storing media resources in a database:

    • Nel modello di dati non devono essere incluse le proprietà binarie che sono risorse multimediali.A binary property that is a media resource should not be included in the data model. Tutte le proprietà esposte in un modello di dati vengono restituite nell'elemento entry di un feed di risposta.All properties exposed in a data model are returned in the entry in a response feed.

    • Per migliorare le prestazioni con flussi binari di grandi dimensioni, è consigliabile creare una classe del flusso personalizzata per archiviare i dati binari nel database.To improve performance with a large binary stream, we recommend that you create a custom stream class to store binary data in the database. Questa classe viene restituita dall'implementazione di GetWriteStream e invia i dati binari al database in blocchi.This class is returned by your GetWriteStream implementation and sends the binary data to the database in chunks. Per un database di SQL Server, è consigliabile usare una classe FILESTREAM per trasmettere dati nel database quando i dati binari sono maggiori di 1MB.For a SQL Server database, we recommend that you use a FILESTREAM to stream data into the database when the binary data is larger than 1MB.

    • Assicurarsi che il database sia stato progettato per archiviare flussi binari di grandi dimensioni che devono essere ricevuti dal servizio dati.Ensure that your database is designed to store the binary large streams that are to be received by your data service.

    • Quando un client invia una richiesta POST per inserire un elemento entry di collegamento multimediale e una risorsa multimediale in una sola richiesta, viene chiamato GetWriteStream per ottenere il flusso prima che il servizio dati inserisca la nuova entità nel database.When a client sends a POST request to insert a media link entry with a media resource in a single request, GetWriteStream is called to obtain the stream before the data service inserts the new entity into the database. Un'implementazione del provider di flusso deve essere in grado di gestire questo comportamento del servizio dati.A streaming provider implementation must be able to handle this data service behavior. Usare una tabella di dati separata per archiviare i dati binari o archiviare il flusso di dati in un file fino al completo inserimento dell'entità nel database.Consider using a separate data table to store the binary data or store the data stream in a file until after the entity has been inserted into the database.

  • Quando si implementa il metodo DeleteStream, GetReadStream o GetWriteStream, è necessario usare i valori eTag e Content-Type forniti come parametri dei metodi.When you implement the DeleteStream, GetReadStream, or GetWriteStream methods, you must use the eTag and Content-Type values that are supplied as method parameters. Non impostare le intestazioni eTag o Content-Type nell'implementazione del provider IDataServiceStreamProvider.Do not set eTag or Content-Type headers in your IDataServiceStreamProvider provider implementation.

  • Per impostazione predefinita, il client invia i flussi binari di grandi dimensioni tramite codifica di trasferimento HTTP Chunked.By default, the client sends large binary streams by using a chunked HTTP Transfer-Encoding. Poiché il ASP.NETASP.NET Development Server non supporta questo tipo di codifica, è possibile utilizzare il server Web per ospitare un servizio dati di flusso che debba accettare flussi binari di grandi dimensioni.Because the ASP.NETASP.NET Development Server does not support this kind of encoding, you cannot use this Web server to host a streaming data service that must accept large binary streams. Per ulteriori informazioni su ASP.NETASP.NET Development Server, vedere server Web in Visual Studio per progetti Web ASP.NET.For more information on ASP.NETASP.NET Development Server, see Web Servers in Visual Studio for ASP.NET Web Projects.

Requisiti di versioneVersioning Requirements

Il provider di flusso prevede i seguenti requisiti di versione del protocollo ODataOData:The streaming provider has the following ODataOData protocol versioning requirements:

  • Il provider di flusso richiede che il servizio dati supporti la versione 2.0 del protocollo ODataOData e versioni successive.The streaming provider requires that the data service support version 2.0 of the ODataOData protocol and later versions.

Per ulteriori informazioni, vedere controllo delle versioni del servizio dati.For more information, see Data Service Versioning.

Vedere ancheSee Also

Provider di servizi datiData Services Providers
Provider di servizi dati personalizzatiCustom Data Service Providers
Utilizzo di dati binariWorking with Binary Data