Partager via


Utilisation de données binaires (WCF Data Services)

La bibliothèque cliente Services de données WCF vous permet de récupérer et de mettre à jour les données binaires d'un flux Protocole OData (Open Data) de l'une des façons suivantes :

  • Comme une propriété de type primitif d'entité. Il s'agit de la méthode conseillée lors de l'utilisation de petits objets de données binaires, faciles à charger en mémoire. Dans ce cas, la propriété binaire est une propriété d'entité exposée par le modèle de données, et le service de données sérialise les données binaires sous forme de XML binaire encodé Base 64 dans le message de réponse.

  • Comme un flux distinct de ressources binaires. Ceci est la méthode conseillée pour l'accès et la modification de données d'objet BLOB (binary large object) qui peuvent représenter des photos, des vidéos ou tout autre type de données binaires encodées.

Services de données WCF implémente la diffusion en continu de données binaires en utilisant le protocole HTTP comme défini dans le protocole OData. OData fournit les mécanismes de diffusion en continu suivants pour associer des données binaires à une entité :

  • Ressource multimédia/entrée de lien média

    AtomPub (Atom Publishing Protocol) définit un mécanisme pour associer des données binaires en tant que ressource multimédia à une entrée de flux de données, appelée entrée de lien média. Il ne peut exister qu'une ressource multimédia définie pour une entrée donnée de lien média. Une ressource multimédia peut être considérée comme un flux de données par défaut d'une entité. OData hérite de ce comportement de diffusion en continu d'AtomPub.

  • Flux de ressources nommé

    Depuis la version 3 de OData, une entité peut avoir plusieurs flux de ressources associés, qui sont accessibles par nom. Ce mécanisme ne dépend pas d'AtomPub, il est donc possible qu'une entité possède les flux de données nommés de ressource et ne soit pas une entrée de lien multimédia. Il est également possible qu'une entrée de lien média ait les flux nommés. Pour plus d'informations, consultez Fournisseurs de diffusion en continu (WCF Data Services).

Métadonnées d'entité

Une entité qui a des flux de ressources binaires liés est indiquée dans les métadonnées du service de données de l'une des façons suivantes, selon le type de flux :

  1. Ressource multimédia :

    Par l'attribut HasStream d'un type d'entité qui est l'entrée de lien multimédia.

  2. Flux de ressource nommé :

    Par une ou plusieurs propriétés d'une entité dans le modèle de données qui sont du type de données Stream.

    La prise en charge du type de données Stream du modèle de données requiert la version 2.2 d'EDM. Pour plus d'informations, consultez Streaming Provider (WCF Data Services).

Dans l'exemple suivant, l'entité PhotoInfo est une entrée de lien multimédia qui a à la fois une ressource multimédia associée, indiquée par l'attribut HasStream, et un flux de ressources nommé, nommé Thumbnail.

<EntityType Name="PhotoInfo" m:HasStream="true">
  <Key>
    <PropertyRef Name="PhotoId" />
  </Key>
  <Property Name="PhotoId" Type="Edm.Int32" Nullable="false" 
            p9:StoreGeneratedPattern="Identity" 
            xmlns:p9="https://schemas.microsoft.com/ado/2009/02/edm/annotation" />
  <Property Name="FileName" Type="Edm.String" Nullable="false" />
  <Property Name="FileSize" Type="Edm.Int32" Nullable="true" />
  <Property Name="DateTaken" Type="Edm.DateTime" Nullable="true" />
  <Property Name="TakenBy" Type="Edm.String" Nullable="true" />
  <Property Name="DateAdded" Type="Edm.DateTime" Nullable="false" />
  <Property Name="Exposure" Type="PhotoData.Exposure" Nullable="false" />
  <Property Name="Dimensions" Type="PhotoData.Dimensions" Nullable="false" />
  <Property Name="DateModified" Type="Edm.DateTime" Nullable="false" />
  <Property Name="Comments" Type="Edm.String" Nullable="true" MaxLength="Max" 
            Unicode="true" FixedLength="false" />
  <Property Name="ContentType" Type="Edm.String" Nullable="true" MaxLength="50" 
            Unicode="true" FixedLength="false" />
  <Property Name="Thumbnail" Type="Edm.Stream" Nullable="false" />
</EntityType>

Les autres exemples de cette rubrique indiquent comment accéder et modifier le flux de ressources multimédia. Pour un exemple complet de consommation d'un flux de ressources multimédia dans une application cliente .NET Framework en utilisant la bibliothèque cliente Services de données WCF, consultez la publication Accès à un flux de ressources multimédia à partir du client.

Accès aux flux de ressources binaires

La bibliothèque cliente Services de données WCF offre des méthodes pour accéder aux flux de ressources multimédia depuis un service de données basé sur OData. Lors du téléchargement d'une ressource multimédia, vous pouvez utiliser l'URI de la ressource multimédia ou bien vous pouvez obtenir un flux binaire qui contient les données de la ressource multimédia elle-même. Vous pouvez également télécharger les données de la ressource multimédia sous la forme d'un flux binaire.

Conseil

Pour un exemple pas à pas de création d'une application cliente Windows Presentation Foundation (WPF) qui télécharge des fichiers d'image binaires depuis un service OData stockant des photos, consultez la publication Série Fournisseur de diffusion en continu Data Services-Partie 2 : Accès à un flux de ressources multimédia à partir du client.Pour télécharger l'exemple de code du service de données de diffusion en continu de photos, consultez la publication de blog suivante : Exemple de service de diffusion de données en continu de photos dans MSDN Code Gallery.

Obtenir l'URI du flux binaire

Lorsque vous récupérez certains types de ressources multimédia, tels que des images et d'autres fichiers multimédia, il est souvent plus facile d'utiliser l'URI de la ressource média de votre application que le flux de données binaires lui-même. Pour obtenir l'URI d'un flux de ressources associé à une entrée de lien média donnée, vous devez appeler la méthode GetReadStreamUri(Object) sur l'instance DataServiceContext qui suit l'entité. Pour obtenir l'URI d'un flux de données de ressources nommé, appelez la surcharge de méthode qui prend un paramètre name, qui est le nom du flux de données. L'exemple suivant illustre comment appeler la méthode GetReadStreamUri(Object) pour obtenir l'URI d'un flux de ressources multimédia utilisé pour créer une nouvelle image sur le client :

' Use the ReadStreamUri of the Media Resource for selected PhotoInfo object
' as the URI source of a new bitmap image.
photoImage.Source = New BitmapImage(context.GetReadStreamUri(currentPhoto))
// Use the ReadStreamUri of the Media Resource for selected PhotoInfo object
// as the URI source of a new bitmap image.
photoImage.Source = new BitmapImage(context.GetReadStreamUri(currentPhoto));

Pour les flux de ressources nommés, vous pouvez également obtenir l'URI directement du flux à partir de la propriété du flux. Pour chaque propriété de l'entrée de lien multimédia retournée par les métadonnées du service de données d'un type Stream, les outils du service de données génèrent une propriété qui retourne une instance de DataServiceStreamLink. La propriété Uri de ce DataServiceStreamLink est l'URI du flux de ressources nommé. Cela vous permet d'obtenir l'URI directement à partir de l'objet de type entrée de lien multimédia ou grâce à LINQ (Langage Integrated Query).

Téléchargement d'un flux de ressources binaires

Lorsque vous récupérez un flux de ressources binaires, vous devez appeler la méthode GetReadStream sur l'instance DataServiceContext qui effectue le suivi de l'entrée de lien média. Cette méthode envoie une demande au service de données qui retourne un objet DataServiceStreamResponse, lequel possède une référence au flux de données qui contient la ressource. Utilisez cette méthode lorsque votre application nécessite que la ressource binaire soit un Stream. Lorsque vous accédez à un flux de ressource nommé, appelez la surcharge de méthode qui prend un paramètre name, qui est le nom du flux de ressource. L'exemple suivant illustre comment appeler la méthode GetReadStream pour récupérer un flux utilisé pour créer une nouvelle image sur le client :

' Get the read stream for the Media Resource of the currently selected 
' entity (Media Link Entry).
Using response As DataServiceStreamResponse = _
        context.GetReadStream(currentEmployee, "image/bmp")

    ' Use the returned binary stream to create a bitmap image that is 
    ' the source of the image control.
    employeeImage.Source = CreateBitmapFromStream(response.Stream)
End Using
// Get the read stream for the Media Resource of the currently selected 
// entity (Media Link Entry).
using (DataServiceStreamResponse response =
    context.GetReadStream(currentEmployee, "image/bmp"))
{
    // Use the returned binary stream to create a bitmap image that is 
    // the source of the image control.
    employeeImage.Source = CreateBitmapFromStream(response.Stream);
}

Notes

L'en-tête Content-Length du message de réponse qui contient le flux binaire en continu n'est pas défini par le service de données.Cette valeur ne peut pas refléter la longueur réelle du flux de données binaires en continu.

Téléchargement d'une ressource multimédia comme un flux

Pour insérer ou mettre à jour une ressource multimédia, appelez la méthode SetSaveStream sur l'instance DataServiceContext qui effectue le suivi de l'entité. Cette méthode envoie une demande au service de données qui contient la ressource multimédia lue depuis le flux de données fourni. Lorsque vous chargez un flux de ressource nommé, appelez la surcharge de méthode qui prend un paramètre name, qui est le nom du flux de ressource. L'exemple suivant indique comment appeler la méthode SetSaveStream pour envoyer une image bitmap appartenant à un employé spécifique au service de données :

' Set the file stream as the source of binary stream 
' to send to the data service. The Slug header is the file name and
' the content type is determined from the file extension. 
' A value of 'true' means that the stream is closed by the client when 
' the upload is complete.
context.SetSaveStream(photoEntity, imageStream, True, _
    photoEntity.ContentType, photoEntity.FileName)
// Set the file stream as the source of binary stream 
// to send to the data service. The Slug header is the file name and
// the content type is determined from the file extension. 
// A value of 'true' means that the stream is closed by the client when 
// the upload is complete.
context.SetSaveStream(photoEntity, imageStream, true,
    photoEntity.ContentType, photoEntity.FileName);

Dans cet exemple, la méthode SetSaveStream est appelée en fournissant une valeur true pour le paramètre closeStream. Cela garantit que l'objet DataServiceContext ferme le flux de données une fois les données binaires téléchargées sur le service de données.

Notes

Lorsque vous appelez SetSaveStream(Object, String, Stream, Boolean, String), le flux n'est pas transmis au service de données jusqu'à ce que la méthode SaveChanges soit appelée.

Voir aussi

Concepts

Liaison des données aux contrôles (WCF Data Services)

Autres ressources

Client de données (WCF Data Services)