Partager via


Fournisseurs de diffusion en continu (WCF Data Services)

Un service de données peut exposer des données Large Object Binary. Ces données binaires peuvent représenter des flux vidéo et audio, des images, des fichiers de document ou d'autres types de supports binaires. Lorsqu'une entité du modèle de données inclut une ou plusieurs propriétés binaires, le service de données retourne ces données binaires encodées en Base 64 au sein de l'entrée dans le flux de réponse. Étant donné que ce type de chargement et de sérialisation de données binaires volumineuses peut affecter les performances, le protocole Protocole OData (Open Data) définit un mécanisme de récupération des données binaires indépendant de l'entité à laquelle elles appartiennent. Cela s'effectue en séparant l'entité et les données binaires de l'entité dans un ou plusieurs flux de données

  • Ressource multimédia : données binaires qui appartiennent à une entité, telle qu'une vidéo, du son, une image ou d'autres types de flux de ressources multimédias.

  • Entrée de lien média : une entité ayant une référence à un flux de ressources multimédias associé.

Avec Services de données WCF , vous définissez un flux de ressources binaires en implémentant un fournisseur de données en continu. L'implémentation du fournisseur de diffusion en continu fournit le service de données avec le flux de ressources multimédias associé à une entité spécifique sous forme d'objet Stream. Cette implémentation permet au service de données d'accepter et de retourner les ressources multimédias sur HTTP sous forme de flux de données binaires d'un type MIME spécifié.

La configuration d'un service de données afin de prendre en charge la diffusion en continu de données binaires requiert les étapes suivantes :

  1. Attribuer une ou plusieurs entités dans le modèle de données comme entrées de lien média. Ces entités ne doivent pas inclure les données binaires à transmettre en continu. Les propriétés binaires d'une entité sont toujours retournées dans l'entrée comme des données binaires encodées Base 64.

  2. Implémentation de l'interface T:System.Data.Services.Providers.IDataServiceStreamProvider

  3. Définir un service de données qui implémente l'interface IServiceProvider. Le service de données utilise l'implémentation GetService pour accéder à l'implémentation du fournisseur de données en continu. Cette méthode retourne l'implémentation de fournisseur de données en continu appropriée.

  4. Autoriser des flux de messages volumineux dans la configuration de l'application Web.

  5. Activer l'accès aux ressources binaires sur le serveur ou dans une source de données.

Les exemples de cette rubrique sont basés sur un exemple de service de diffusion de photos en continu, qui est décrit en détail dans l'article Série Fournisseur de diffusion en continu Data Services : Implémentation d'un fournisseur de diffusion en continu (première partie). Le code source pour ce service exemple est disponible sur la page Exemple de service de diffusion de données en continu de photos dans MSDN Code Gallery.

Définition d'une entrée de lien média dans le modèle de données

Le fournisseur de sources de données détermine la façon dont une entité est définie comme une entrée de lien média dans le modèle de données.

  • Fournisseur Entity Framework
    Pour indiquer qu'une entité est une entrée de lien média, ajoutez l'attribut HasStream à la définition du type d'entité dans le modèle conceptuel, comme dans l'exemple suivant :

    <EntityType xmlns:m="https://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>
    

    Vous devez également ajouter l'espace de noms xmlns:m=https://schemas.microsoft.com/ado/2007/08/dataservices/metadata à l'entité ou à la racine du fichier .edmx ou .csdl qui définit le modèle de données.

    Pour obtenir un exemple de d'un service de données qui utilise le fournisseur Entity Framework et expose une ressource multimédia, consultez l'article Série Fournisseur de diffusion en continu Data Services : Implémentation d'un fournisseur de diffusion en continu (première partie).

  • Fournisseur de réflexion
    Pour indiquer qu'une entité est une entrée de lien média, ajoutez l'objet HasStreamAttribute à la classe qui définit le type d'entité dans le fournisseur de réflexion.

Implémentation de l'interface IDataServiceStreamProvider

Pour créer un service de données qui prend en charge les flux de données binaires, vous devez implémenter l'interface IDataServiceStreamProvider. Cette implémentation permet au service de données de retourner les données binaires comme un flux de données au client et de consommer les données binaires comme un flux de données transmis par le client. Ce service de données crée une instance de cette interface chaque fois qu'il doit accéder aux données binaires sous forme de flux de données. L'interface IDataServiceStreamProvider spécifie les membres suivants.

Nom de membre Description

DeleteStream

Cette méthode est appelée par le service de données pour supprimer la ressource multimédia correspondante lorsque son entrée de lien média est supprimée. Lorsque vous implémentez IDataServiceStreamProvider, cette méthode contient le code qui supprime la ressource multimédia associé à l'entrée de lien média fournie.

GetReadStream

Cette méthode est appelée par le service de données pour retourner une ressource multimédia sous forme de flux de données. Lorsque vous implémentez IDataServiceStreamProvider, cette méthode contient le code qui fournit un flux de données utilisé par le service de données pour retourner la ressource multimédia associée à l'entrée de lien média fournie.

GetReadStreamUri

Cette méthode est appelée par le service de données pour retourner l'URI utilisé pour demander la ressource multimédia pour l'entrée de lien média. Cette valeur est utilisée pour créer l'attribut src dans l'élément de contenu de l'entrée de lien média et qui est utilisé pour demander le flux de données. Lorsque cette méthode retourne Null, le service de données détermine automatiquement l'URI. Utilisez cette méthode lorsque vous devez fournir aux clients un accès direct aux données binaires sans utiliser le fournisseur de flux.

GetStreamContentType

Cette méthode est appelée par le service de données pour retourner la valeur Content-Type de la ressource multimédia associée à l'entrée de lien média spécifiée.

GetStreamETag

Cette méthode est appelée par le service de données pour retourner l'eTag du flux de données associé à l'entité spécifiée. Cette méthode est utilisée lorsque vous gérez l'accès concurrentiel des données binaires. Lorsque cette méthode retourne la valeur null, le service de données ne suit pas l'accès concurrentiel.

GetWriteStream

Cette méthode est appelée par le service de données pour obtenir le flux de données utilisé lors de la réception du flux de données transmis par le client. Lorsque vous implémentez IDataServiceStreamProvider, vous devez retourner un flux de données accessible en écriture sur lequel le service de données écrit le flux de données reçues.

ResolveType

Retourne un nom de type qualifié par un espace de noms qui représente le type que le runtime du service de données doit créer pour l'entrée de lien média associée au flux de données pour la ressource multimédia insérée.

Création du service de données en continu

Pour donner au runtime Services de données WCF accès à l'implémentation de IDataServiceStreamProvider, le service de données que vous créez doit également implémenter l'interface IServiceProvider. L'exemple de code suivant illustre l'implémentation de la méthode GetService pour retourner une instance de classe PhotoServiceStreamProvider qui implémente IDataServiceStreamProvider.

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(IDataServiceStreamProvider2) Then
            Return New PhotoServiceStreamProvider(Me.CurrentDataSource)
        End If
        Return Nothing
    End Function
#End Region
End Class
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);

        // Named resource streams require version 3 of the OData protocol.
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
    }
    public object GetService(Type serviceType)
    {
        if (serviceType == typeof(IDataServiceStreamProvider2))
        {
            // Return the stream provider to the data service.
            return new PhotoServiceStreamProvider(this.CurrentDataSource);
        }
        
        return null;
    }
}

Pour plus d'informations générales sur la création d'un service de données, consultez Configuration du service de données (WCF Data Services).

Activation de flux binaires volumineux dans l'environnement d'hébergement

Lorsque vous créez un service de données dans une application Web, ASP.NET, Windows Communication Foundation (WCF) est utilisé pour fournir l'implémentation du protocole HTTP. Par défaut, WCF limite la taille des messages HTTP à 65 kilo-octets. Pour pouvoir transmettre en continu des données binaires volumineuses depuis et vers le service de données, vous devez également configurer l'application Web pour autoriser les fichiers binaires volumineux et utiliser des flux de données pour le transfert. Pour cela, ajoutez les éléments suivants dans l'élément <configuration /> du fichier Web.config de l'application :

 <system.serviceModel>
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
     <services>
         <!-- The name of the service -->
         <service name="PhotoService.PhotoData">
             <!--you can leave the address blank or specify your end point URI-->
             <endpoint binding="webHttpBinding" bindingConfiguration="higherMessageSize" 
               contract="System.Data.Services.IRequestHandler"></endpoint>
         </service>
     </services>
     <bindings>
         <webHttpBinding>
             <!-- configure the maxReceivedMessageSize value to suit the max size of 
the request (in bytes) you want the service to receive-->
             <binding name="higherMessageSize" transferMode="Streamed"  
              maxReceivedMessageSize="2147483647"/>
         </webHttpBinding>
     </bindings>
 </system.serviceModel>
Ee960144.note(fr-fr,VS.100).gifRemarque :
Vous devez utiliser un mode de transfert System.ServiceModel.TransferMode.Streamed pour vous assurer que les données binaires des messages de demande et de réponse sont transmis en continu et non mis en mémoire tampon par WCF.

Pour plus d'informations, consultez Streaming Message Transfer et Transport Quotas.

Par défaut, Internet Information Services (IIS) limite également la taille des demandes à 4 Mo. Pour activer votre service de données pour recevoir des flux supérieurs à 4 Mo lors d'une exécution sur IIS, vous devez également définir l'attribut maxRequestLength de l'httpRuntime Element dans la section de configuration <system.web />, comme indiqué dans l'exemple suivant :

  <system.web>
      <!-- maxRequestLength (in KB): default=4000 (4MB); max size=2048MB. -->
      <httpRuntime maxRequestLength="2000000"/>
</system.web>

Utilisation de flux de données en continu dans une application cliente

La bibliothèque cliente Services de données WCF vous permet de récupérer et de mettre à jour ces ressources exposées sous la forme de flux binaires sur le client. Pour plus d'informations, consultez Utilisation de données binaires (WCF Data Services).

Remarques sur l'utilisation d'un fournisseur de diffusion en continu

Les éléments suivants sont à prendre en compte lorsque vous implémentez un fournisseur de diffusion en continu et lorsque vous accédez aux ressources multimédias d'un service de données.

  • Les demandes MERGE ne sont pas prises en charge pour les ressources multimédias. Utilisez une demande PUT pour modifier la ressource multimédia d'une entité existante.

  • Une requête POST ne peut pas être utilisée pour créer une entrée de lien média. Vous devez plutôt émettre une requête POST pour créer une ressource multimédia. Le service de données crée alors une entrée de lien média avec les valeurs par défaut. Cette nouvelle entité peut être mise à jour par une demande MERGE ou PUT ultérieure. Vous pouvez également envisager de mettre en cache l'entité et de faire des mises à jour dans le dispositif de nettoyage, par exemple d'affecter à la propriété la valeur de l'en-tête Slug dans la requête POST.

  • Lorsqu'une requête POST est reçue, le service de données appelle la méthode GetWriteStream pour créer la ressource multimédia avant d'appeler la méthode SaveChanges pour créer l'entrée de lien média.

  • Une implémentation de la méthode GetWriteStream ne doit pas retourner d'objet MemoryStream. Si vous utilisez ce type de flux de données, des problèmes de ressource mémoire se produiront lorsque le service recevra des flux de données très volumineux.

  • Voici des éléments à prendre en compte lors du stockage de ressources multimédias dans une base de données :

    • Une propriété binaire qui est une ressource multimédia ne doit pas être incluse dans le modèle de données. Toutes les propriétés exposées dans un modèle de données sont retournées dans l'entrée dans un flux de réponse.

    • Pour améliorer les performances avec des flux binaires volumineux, nous vous conseillons de créer une classe de flux de données personnalisée pour stocker les données binaires dans la base de données. Cette classe est retournée par votre implémentation de GetWriteStream et transmet les données binaires à la base de données par segments. Pour une base de données SQL Server, nous vous conseillons d'utiliser un FILESTREAM pour diffuser les données en continu dans la base de données lorsque la taille des données binaires est supérieure à 1 Mo.

    • Vérifiez que votre base de données est conçue pour stocker les flux de données binaires volumineux qui seront reçus par votre service de données.

    • Lorsqu'un client envoie une requête POST pour insérer une entrée de lien média avec une ressource multimédia dans une demande unique, la méthode GetWriteStream est appelée pour obtenir le flux de données avant que le service de données n'insère la nouvelle entité dans la base de données. Une implémentation de fournisseur de diffusion en continu doit pouvoir gérer ce comportement de service de données. Envisagez d'utiliser une table de données distincte pour stocker les données binaires ou stockez le flux de données dans un fichier jusqu'à ce que l'entité soit insérée dans la base de données.

  • Lorsque vous implémentez les méthodes DeleteStream, GetReadStreamou GetWriteStream, vous devez utiliser les valeurs eTag et Content-Type fournies comme paramètres de méthode. Ne définissez pas d'en-tête eTag ou Content-Type dans votre implémentation de fournisseur IDataServiceStreamProvider.

  • Par défaut, le client transmet les flux binaires volumineux à l'aide d'un encodage de transfert HTTP segmenté. Étant donné que le serveur de développement ASP.NET ne prend pas en charge ce type d'encodage, vous ne pouvez pas utiliser ce serveur Web pour héberger un service de données en continu qui doit accepter des flux binaires volumineux. Pour plus d'informations sur le serveur de développement ASP.NET, consultez Web Servers in Visual Web Developer.

Conditions requises pour le contrôle de version

Le fournisseur de diffusion en continu respecte les conditions requises pour le contrôle de version de protocole OData suivantes :

  • Le fournisseur de diffusion en continu requiert que le client et le service de données prennent en charge les versions 2.0 et ultérieures du protocole OData .

Pour plus d'informations, consultez Utilisation de plusieurs versions de WCF Data Services.

Voir aussi

Concepts

Fournisseurs de services de données (WCF Data Services)
Fournisseurs de services de données personnalisés (WCF Data Services)
Utilisation de données binaires (WCF Data Services)