Streaminganbieter (WCF Data Services)

Ein Datendienst kann große BLOB-Daten (Binary Large Object) verfügbar machen. Diese Binärdaten können Video- und Audiostreams, Bilder, Dokumentdateien oder andere Typen binärer Medien darstellen. Wenn eine Entität im Datenmodell eine oder mehrere binäre Eigenschaften enthält, gibt der Datendienst diese als Base-64-codierte Binärdaten im Eintrag im Antwortfeed zurück. Da das Laden und das Serialisieren von umfangreichen Binärdaten auf diese Weise die Leistung beeinträchtigen können, definiert Open Data Protocol (OData)  einen Mechanismus zum Abrufen von Binärdaten unabhängig von der Entität, zu der sie gehören. Dies wird erreicht, indem die Binärdaten und die Entität in einen oder mehrere Datenströme getrennt werden.

  • Medienressource – Binärdaten, die zu einer Entität gehören, z. B. ein Video, ein Audioelement, ein Bild oder ein anderer Typ von Medienressourcenstream.

  • Medienlinkeintrag – eine Entität, die über einen Verweis auf einen zugehörigen Medienressourcenstream verfügt.

Mit WCF Data Services definieren Sie einen binären Ressourcenstream durch das Implementieren eines Streamingdatenanbieters. Die Implementierung des Streaminganbieters stellt dem Datendienst den einer bestimmten Entität zugeordneten Medienressourcenstream als Stream-Objekt zur Verfügung. Diese Implementierung ermöglicht dem Datendienst, Medienressourcen über HTTP als binäre Datenströme eines angegebenen MIME-Typs zu akzeptieren und zurückzugeben.

Folgende Schritte sind erforderlich, um einen Datendienst zu konfigurieren, der das Streaming von Binärdaten unterstützt:

  1. Kennzeichnen Sie mindestens eine Entität im Datenmodell als Medienlinkeintrag. Diese Entitäten dürfen die als Datenstrom zu sendenden Binärdaten nicht enthalten. Alle binären Eigenschaften einer Entität werden im Eintrag stets als Base-64-codierte Binärdaten zurückgegeben.

  2. Implementieren Sie die T:System.Data.Services.Providers.IDataServiceStreamProvider-Schnittstelle.

  3. Definieren Sie einen Datendienst, der die IServiceProvider-Schnittstelle implementiert. Der Datendienst verwendet die GetService-Implementierung, um auf die Implementierung des Streamingdatenanbieters zuzugreifen. Diese Methode gibt die entsprechende Streaminganbieterimplementierung zurück.

  4. Aktivieren Sie große Nachrichtendatenströme in der Konfiguration der Webanwendung.

  5. Aktivieren Sie den Zugriff auf binäre Ressourcen auf dem Server oder in einer Datenquelle.

Die Beispiele in diesem Thema basieren auf einem Beispiel für einen Streamingfotodienst, das ausführlich im Beitrag Data Services Streaming Provider Series: Implementing a Streaming Provider (Part 1) erläutert wird. Der Quellcode für diesen Beispieldienst ist auf der Seite Streaming Photo Data Service Sample in der MSDN Code Gallery verfügbar.

Definieren eines Medienlinkeintrags im Datenmodell

Der Datenquellenanbieter bestimmt die Methode, mit der eine Entität im Datenmodell als Medienlinkeintrag definiert wird.

  • Entity Framework-Anbieter
    Um anzugeben, dass eine Entität ein Medienlinkeintrag ist, fügen Sie der Entitätstypdefinition das HasStream-Attribut im konzeptionellen Modell hinzu, wie im folgenden Beispiel dargestellt:

    <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>
    

    Sie müssen außerdem entweder der Entität oder dem Stamm der EDMX- oder CSDL-Datei, die das Datenmodell definiert, den Namespace xmlns:m=https://schemas.microsoft.com/ado/2007/08/dataservices/metadata hinzufügen.

    Ein Beispiel zu zu einem Datendienst, der den Entity Framework -Anbieter verwendet und eine Medienressource verfügbar macht, finden Sie im Beitrag Data Services Streaming Provider Series: Implementing a Streaming Provider (Part 1).

  • Reflektionsanbieter
    Um anzugeben, dass eine Entität ein Medienlinkeintrag ist, fügen Sie der Klasse, die den Entitätstyp im Reflektionsanbieter definiert, HasStreamAttribute hinzu.

Implementieren der IDataServiceStreamProvider-Schnittstelle

Um einen Datendienst zu erstellen, der binäre Datenströme unterstützt, müssen Sie die IDataServiceStreamProvider-Schnittstelle implementieren. Diese Implementierung ermöglicht dem Datendienst, Binärdaten als Datenstrom an den Client zurückzugeben und Binärdaten als einen vom Client gesendeten Datenstrom zu nutzen. Der Datendienst erstellt immer dann eine Instanz dieser Schnittstelle, wenn er auf Binärdaten als Datenstrom zugreifen muss. Die IDataServiceStreamProvider-Schnittstelle legt die folgenden Member fest:

Membername Beschreibung

DeleteStream

Diese Methode wird vom Datendienst aufgerufen, um die entsprechende Medienressource zu löschen, wenn ihr Medienlinkeintrag gelöscht wird. Wenn Sie IDataServiceStreamProvider implementieren, enthält diese Methode den Code, mit dem die dem angegebenen Medienlinkeintrag zugeordnete Medienressource gelöscht wird.

GetReadStream

Diese Methode wird vom Datendienst aufgerufen, um eine Medienressource als Datenstrom zurückzugeben. Wenn Sie IDataServiceStreamProvider implementieren, enthält diese Methode den Code, der einen Datenstrom bereitstellt, der vom Datendienst zum Zurückgeben der dem bereitgestellten Medienlinkeintrag zugeordneten Medienressource verwendet wird.

GetReadStreamUri

Diese Methode wird vom Datendienst aufgerufen, um den URI zurückzugeben, der zum Anfordern der Medienressource für den Medienlinkeintrag verwendet wird. Dieser Wert wird verwendet, um das src-Attribut im Inhaltselement des Medienlinkeintrags zu erstellen. Dieses wird verwendet, um den Datenstrom anzufordern. Wenn diese Methode NULL zurückgibt, bestimmt der Datendienst den URI automatisch. Verwenden Sie diese Methode, wenn Sie Clients mit direktem Zugriff auf binäre Daten ohne Verwendung des Streamanbieters bereitstellen müssen.

GetStreamContentType

Diese Methode wird vom Datendienst aufgerufen, um den Content-Type-Wert der Medienressource zurückzugeben, die dem angegebenen Medienlinkeintrag zugeordnet ist.

GetStreamETag

Diese Methode wird vom Datendienst aufgerufen, um das eTag des Datenstroms zurückzugeben, das der angegebenen Entität zugeordnet ist. Diese Methode wird verwendet, wenn Sie Parallelität für die Binärdaten verwalten. Wenn diese Methode NULL zurückgibt, überwacht der Datendienst die Parallelität nicht.

GetWriteStream

Diese Methode wird vom Datendienst aufgerufen, um den Datenstrom abzurufen, der beim Empfangen des vom Client gesendeten Datenstroms verwendet wird. Wenn Sie IDataServiceStreamProvider implementieren, müssen Sie einen überschreibbaren Datenstrom zurückgeben, in den der Datendienst empfangene Datenstromdaten schreibt.

ResolveType

Gibt einen mit einem Namespace qualifizierten Typnamen zurück, der den Typ darstellt, den die Datendienstlaufzeit für den Medienlinkeintrag erstellen muss, der dem Datenstrom für die Medienressource zugeordnet ist, die eingefügt wird.

Erstellen des Streamingdatendiensts

Damit die WCF Data Services -Laufzeit auf die IDataServiceStreamProvider-Implementierung zugreifen kann, muss der Datendienst, den Sie erstellen, auch die IServiceProvider-Schnittstelle implementieren. Im folgenden Beispiel wird gezeigt, wie die GetService-Methode implementiert wird, um eine Instanz der PhotoServiceStreamProvider-Klasse zurückzugeben, die IDataServiceStreamProvider implementiert.

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

Allgemeine Informationen zum Erstellen eines Datendiensts finden Sie unter Konfigurieren des Datendiensts (WCF Data Services).

Aktivieren von großen binären Datenströmen in der Hostumgebung

Wenn Sie einen Datendienst in einer ASP.NET-Webanwendung erstellen, wird Windows Communication Foundation (WCF) verwendet, um die HTTP-Protokollimplementierung bereitzustellen. Standardmäßig schränkt WCF die Größe von HTTP-Nachrichten auf nur 65 KB ein. Damit umfangreiche Binärdaten als Datenstrom zum und vom Datendienst gesendet werden können, müssen Sie auch die Webanwendung für die Verwendung großer Binärdateien und den Einsatz von Datenströmen für die Übertragung konfigurieren. Fügen Sie dazu Folgendes im <configuration />-Element der Datei Web.config der Anwendung hinzu:

 <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(de-de,VS.100).gifHinweis:
Sie müssen einen System.ServiceModel.TransferMode.Streamed-Übertragungsmodus verwenden, damit sichergestellt ist, dass die binären Daten in Anforderungs- und Antwortnachrichten gestreamt und nicht von WCF zwischengespeichert werden.

Weitere Informationen finden Sie unter Streaming Message Transfer und Transport Quotas.

Darüber hinaus wird die Größe von Anforderungen von Internetinformationsdienste (IIS) standardmäßig auf 4 MB begrenzt. Damit Datenströme mit mehr als 4 MB bei der Ausführung in IIS vom Datendienst empfangen werden können, müssen Sie auch das maxRequestLength-Attribut des httpRuntime Element im Konfigurationsabschnitt <system.web /> festlegen, wie im folgenden Beispiel veranschaulicht:

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

Verwenden von Datenströmen in einer Clientanwendung

Mithilfe der WCF Data Services -Clientbibliothek können Sie diese verfügbar gemachten Ressourcen als binäre Datenströme auf dem Client abrufen und aktualisieren. Weitere Informationen finden Sie unter Arbeiten mit Binärdaten (WCF Data Services).

Überlegungen zum Arbeiten mit einem Streaminganbieter

Folgende Aspekte sollten bei der Implementierung eines Streaminganbieters und beim Zugriff auf Medienressourcen von einem Datendienst aus berücksichtigt werden.

  • MERGE-Anforderungen werden für Medienressourcen nicht unterstützt. Verwenden Sie eine PUT-Anforderung, um die Medienressource einer vorhandenen Entität zu ändern.

  • Eine POST-Anforderung kann nicht verwendet werden, um einen neuen Medienlinkeintrag zu erstellen. Stattdessen müssen Sie eine POST-Anforderung absetzen, um eine neue Medienressource zu erstellen, und der Datendienst erstellt einen neuen Medienlinkeintrag mit Standardwerten. Diese neue Entität kann durch eine nachfolgende MERGE- oder PUT-Anforderung aktualisiert werden. Sie sollten außerdem in Betracht ziehen, die Entität zwischenzuspeichern und Aktualisierungen in der Funktion zum Entfernen vorzunehmen, z. B. das Festlegen des Eigenschaftswerts auf den Wert des Headers des Platzhalterfelds in der POST-Anforderung.

  • Wenn eine POST-Anforderung empfangen wird, ruft der Datendienst GetWriteStream auf, um die Medienressource zu erstellen, bevor er SaveChanges aufruft, um den Medienlinkeintrag zu erstellen.

  • Eine Implementierung von GetWriteStream sollte kein MemoryStream-Objekt zurückgeben. Bei der Verwendung solcher Datenströme treten Speicherressourcenprobleme auf, wenn der Dienst sehr große Datenströme empfängt.

  • Folgende Aspekte müssen berücksichtigt werden, wenn Medienressourcen in einer Datenbank gespeichert werden:

    • Eine binäre Eigenschaft, die eine Medienressource ist, sollte nicht im Datenmodell enthalten sein. Alle in einem Datenmodell zur Verfügung gestellten Eigenschaften werden im Eintrag in einem Antwortfeed zurückgegeben.

    • Um die Leistung bei einem großen binären Datenstrom zu verbessern, empfiehlt es sich, eine benutzerdefinierte Datenstromklasse zu erstellen, um Binärdaten in der Datenbank zu speichern. Diese Klasse wird von der GetWriteStream-Implementierung zurückgegeben und sendet die Binärdaten in Blöcken an die Datenbank. Für eine SQL Server-Datenbank empfiehlt es sich, Daten mithilfe eines FILESTREAM in die Datenbank zu übertragen, wenn die Binärdaten größer als 1 MB sind.

    • Stellen Sie sicher, dass die Datenbank zum Speichern großer binärer Datenströme entworfen wurde, die vom Datendienst empfangen werden sollen.

    • Wenn ein Client eine POST-Anforderung sendet, um einen Medienlinkeintrag mit einer Medienressource in einer einzelnen Anforderung einzufügen, wird GetWriteStream aufgerufen, um den Datenstrom abzurufen, bevor der Datendienst die neue Entität in die Datenbank einfügt. Eine Streaminganbieterimplementierung muss in der Lage sein, mit diesem Verhalten des Datendiensts umzugehen. Sie können die Binärdaten mithilfe einer separaten Datentabelle speichern oder den Datenstrom in einer Datei speichern, bis die Entität in die Datenbank eingefügt wurde.

  • Wenn Sie die Methode DeleteStream, GetReadStream oder GetWriteStream implementieren, müssen Sie die eTag- und Content-Type-Werte verwenden, die als Methodenparameter angegeben werden. Legen Sie keine eTag- oder Content-Type-Header in der IDataServiceStreamProvider-Anbieterimplementierung fest.

  • Standardmäßig sendet der Client große binäre Datenströme mithilfe einer segmentierten HTTP-Übertragungscodierung. Da ASP.NET Development Server diese Art von Codierung nicht unterstützt, können Sie diesen Webserver zum Hosten eines Streamingdatendiensts nicht verwenden, der große binäre Datenströme annehmen muss. Weitere Informationen zu ASP.NET Development Server finden Sie unter Web Servers in Visual Web Developer.

Versionsanforderungen

Der Streaminganbieter hat die folgenden Anforderungen an die OData -Protokollversion:

  • Der Streaminganbieter erfordert, dass der Datendienst Version 2.0 des OData -Protokolls und höhere Versionen unterstützt.

Weitere Informationen finden Sie unter Verwenden mehrerer Versionen von WCF Data Services.

Siehe auch

Konzepte

Datendiensteanbieter (WCF Data Services)
Benutzerdefinierte Datendienstanbieter (WCF Data Services)
Arbeiten mit Binärdaten (WCF Data Services)