Arbeiten mit Binärdaten (WCF Data Services)

Die WCF Data Services-Clientbibliothek ermöglicht es Ihnen, Binärdaten wie folgt aus einem Open Data Protocol (OData)-Feed abzurufen und zu aktualisieren:

  • Als primitive Typeigenschaft einer Entität. Dies ist die empfohlene Methode für das Arbeiten mit kleinen Binärdatenobjekten, die problemlos in den Arbeitsspeicher geladen werden können. In diesem Fall handelt es sich bei der binären Eigenschaft um eine vom Datenmodell verfügbar gemachte Entitätseigenschaft. Der Datendienst serialisiert die Binärdaten als binär codiertes base64-XML in der Antwortnachricht.

  • Als separater binärer Ressourcenstream. Dies ist die empfohlene Methode für den Zugriff auf BLOB-Daten (Binary Large Object), die ein Foto, Video oder einen beliebigen anderen Typ binär codierter Daten darstellen, und das Ändern dieser Daten.

WCF Data Services implementiert das Streaming von Binärdaten wie im OData-Protkoll definiert mithilfe von HTTP. OData stellt die folgenden Streamingmechanismen bereit, um Binärdaten einer Entität zuzuordnen:

  • Medienressource/Medienlinkeintrag

    Das Atom Publishing Protocol (AtomPub) definiert einen Mechanismus, um Binärdaten als Medienressource einem Eintrag in einem Datenfeed zuzuordnen, der als Medienlinkeintrag bezeichnet wird. Es kann für einen angegebenen Medienlinkeintrag nur eine definierte Medienressource geben. Eine Medienressource kann als Standarddatenstrom für eine Entität in Betracht gezogen werden. OData übernimmt dieses Streamingverhalten von AtomPub.

  • Benannter Ressourcenstream

    Ab Version 3 von OData kann eine Entität über mehrere zugehörige Ressourcendatenströme verfügen, auf die per Name zugegriffen wird. Dieser Mechanismus hängt nicht von AtomPub ab, deshalb ist es möglich, dass eine Entität über benannte Ressourcendatenströme verfügt und kein Medienlinkeintrag ist. Ein Medienlinkeintrag kann auch über benannte Datenströme verfügen. Weitere Informationen finden Sie unter Streaminganbieter (WCF Data Services).

Entitätsmetadaten

Eine Entität, die über zugehörige binäre Ressourcendatenströme verfügt, wird abhängig vom Typ des Datenstroms in einer der folgenden Methoden in den Datendienstmetadaten angegeben:

  1. Medienressource:

    Durch das HasStream-Attribut ein Entitätstyp, der der Medienlinkeintrag ist.

  2. Benannter Ressourcenstream:

    Durch eine oder mehrere Eigenschaften einer Entität im Datenmodell, das vom Stream-Datentyp ist.

    Die Unterstützung für den Stream-Datentyp im Datenmodell erfordert Version 2.2 von EDM. Weitere Informationen finden Sie unter Streaming Provider (WCF Data Services).

Im folgenden Beispiel ist die PhotoInfo-Entität ein Medienlinkeintrag mit einer verknüpften Medienressource, die durch das HasStream-Attribut angegeben ist, und einem benannten Ressourcendatenstrom mit der Bezeichnung 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>

Die verbleibenden Beispiele in diesem Thema zeigen, wie Sie auf den Medienressourcenstream zugreifen und ihn ändern. Ein vollständiges Beispiel dazu, wie Sie einen Medienressourcenstream mithilfe der WCF Data Services-Clientbibliothek in einer .NET Framework-Clientanwendung nutzen, finden Sie im Beitrag Zugreifen auf einen Medienressourcenstream vom Client.

Zugreifen auf die binären Ressourcenstreams

Die WCF Data Services-Clientbibliothek stellt Methoden für den Zugriff auf binäre Ressourcenstreams von einem OData-basierten Datendienst aus bereit. Wenn Sie eine Medienressource herunterladen, können Sie entweder den URI der Medienressource verwenden oder einen binären Stream abrufen, der die Medienressource selbst enthält. Sie können Medienressourcendaten auch als binären Stream hochladen.

Tipp

Ein ausführliches Beispiel zum Erstellen einer Windows Presentation Foundation (WPF)-Clientanwendung, die binäre Bilddateien von einem OData-Dienst zum Speichern von Fotos herunterlädt, finden Sie im Beitrag Streaminganbieter für Datendienste Teil 2: Zugreifen auf einen Medienressourcenstream vom Client.Den Beispielcode für den Fotostreaming-Datendienst im Blogbeitrag können Sie unter Fotostreaming-Datendienstbeispiel in der MSDN Code Gallery herunterladen.

Abrufen des URI des binären Streams

Beim Abrufen bestimmter Medienressourcentypen wie Bildern und anderen Mediendateien ist es oft einfacher, den URI der Medienressource in der Anwendung zu verwenden, anstatt den binären Datenstrom selbst zu behandeln. Zum Abrufen des URI des zugehörigen Ressourcenstreams eines Medienlinkeintrags müssen Sie die GetReadStreamUri(Object)-Methode für die DataServiceContext-Instanz aufrufen, von der die Entität nachverfolgt wird. Um den URI eines benannten Ressourcendatenstroms abzurufen, rufen Sie die Methodenüberladung auf, die einen name-Parameter annimmt, der der Name des Datenstroms ist. Das folgende Beispiel zeigt, wie Sie die GetReadStreamUri(Object)-Methode aufrufen, um den URI eines Medienressourcenstreams abzurufen, mit dem auf dem Client ein neues Bild erstellt wird:

' 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));

Bei benannten Ressourcendatenströmen können Sie auch den URI des Datenstroms direkt in der Datenstromeigenschaft abrufen. Für jede Eigenschaft des Medienlinkeintrags, die von den Datendienstmetadaten zurückgegeben wird und vom Typ Stream ist, erstellen Tools im Datendienst eine Eigenschaft, die eine DataServiceStreamLink-Instanz zurückgibt. Die Uri-Eigenschaft dieses DataServiceStreamLink ist der URI des benannten Ressourcendatenstroms. Dies ermöglicht es Ihnen, den URI direkt vom Medienlinkeintragsobjekt oder als Ergebnis einer Language Integrated Query (LINQ) abzurufen.

Herunterladen des binären Ressourcenstreams

Wenn Sie einen binären Ressourcenstream abrufen, müssen Sie die GetReadStream-Methode für die DataServiceContext-Instanz aufrufen, von der die Entität nachverfolgt wird. Diese Methode sendet eine Anforderung an den Datendienst, der ein DataServiceStreamResponse-Objekt mit einem Verweis auf den Stream mit der Ressource zurückgibt. Verwenden Sie diese Methode, wenn die Anwendung die binäre Ressource als Stream erfordert. Wenn Sie auf einen benannten Ressourcendatenstrom zugreifen, rufen Sie die Methodenüberladung auf, die einen name-Parameter annimmt, der der Name des Ressourcendatenstroms ist. Das folgende Beispiel zeigt, wie Sie die GetReadStream-Methode aufrufen, um einen Stream abzurufen, mit dem auf dem Client ein neues Bild erstellt wird:

' 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);
}

Hinweis

Der Content-Length-Header der Antwortnachricht, die den binären Datenstrom enthält, wird nicht vom Datendienst festgelegt.Dieser Wert entspricht möglicherweise nicht der tatsächlichen Länge des binären Datenstroms.

Hochladen einer Medienressource als Stream

Um eine Medienressource einzufügen oder zu aktualisieren, rufen Sie die SetSaveStream-Methode für die DataServiceContext-Instanz auf, von der die Entität nachverfolgt wird. Diese Methode sendet eine Anforderung an den Datendienst, die die aus dem angegebenen Stream gelesene Medienressource enthält. Wenn Sie einen benannten Ressourcendatenstrom hochladen, rufen Sie die Methodenüberladung auf, die einen name-Parameter annimmt, der der Name des Ressourcendatenstroms ist. Im folgenden Beispiel wird veranschaulicht, wie die SetSaveStream-Methode aufgerufen wird, um ein Bitmap-Bild eines bestimmten Mitarbeiters an den Datendienst zu senden:

' 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);

In diesem Beispiel wird die SetSaveStream-Methode aufgerufen, indem der Wert true für den closeStream-Parameter angegeben wird. Dadurch wird sichergestellt, dass der DataServiceContext den Stream nach dem Hochladen der Binärdaten in den Datendienst schließt.

Hinweis

Wenn Sie SetSaveStream(Object, String, Stream, Boolean, String) aufrufen, wird der Stream erst beim Aufrufen von SaveChanges an den Datendienst gesendet.

Siehe auch

Konzepte

Binden von Daten an Steuerelemente (WCF Data Services)

Andere Ressourcen

Datenclient (WCF Data Services)