バイナリ データの操作 (WCF Data Services)

WCF Data Services クライアント ライブラリを使用すると、次のいずれかの方法で、Open Data Protocol (OData) フィードからバイナリ データを取得して更新できます。

  • エンティティのプリミティブ型のプロパティとして。 メモリに容易に読み込むことができる小さいバイナリ データ オブジェクトを操作する場合は、この方法が適しています。 この場合、バイナリ プロパティは、データ モデルによって公開されるエンティティ プロパティです。データ サービスは、応答メッセージの Base-64 バイナリ エンコード XML としてバイナリ データをシリアル化します。

  • 個別のバイナリ リソース ストリームとして。 写真、ビデオ、またはその他の種類のバイナリ エンコード データを表すバイナリ ラージ オブジェクト (BLOB) データにアクセスしたり、変更したりする場合は、この方法が適しています。

OData プロトコルで定義されているように、WCF Data Services は HTTP を使用してバイナリ データのストリーミングを実装します。 OData では、次のストリーミング メカニズムを使用して、バイナリ データをエンティティに関連付けます。

  • メディア リソース/メディア リンク エントリ

    Atom Publishing Protocol (AtomPub) は、メディア リソースとしてのバイナリ データをデータ フィード内のエントリに関連付けるためのメカニズムを定義します。これは、メディア エントリ リンクと呼ばれます。 1 つのメディア リンク エントリで定義できるメディア リソースは、1 つだけです。 メディア リソースは、エンティティの既定のストリームと見なすことができます。 OData は、このストリーミングの動作を AtomPub から継承します。

  • 名前付きリソース ストリーム

    OData Version 3 以降では、関連する複数のリソース ストリームをエンティティが持つことができ、それらは名前でアクセスできます。 このメカニズムは AtomPub に依存していないため、エンティティはメディア リンク エントリでなくても、名前付きリソース ストリームを持つことができます。 メディア リンク エントリが名前付きストリームを持つこともできます。 詳細については、「ストリーミング プロバイダー (WCF Data Services)」を参照してください。

エンティティ メタデータ

関連するバイナリ リソース ストリームを持つエンティティは、データ サービス メタデータで、ストリームの種類に応じて次のいずれかの方法で示されます。

  1. メディア リソース:

    メディア リンク エントリであるエンティティ型の HasStream 属性で示されます。

  2. 名前付きリソース ストリーム:

    データ モデル内のエンティティの、Stream データ型の 1 つまたは複数のプロパティで指定します。

    データ モデルでの Stream データ型のサポートには、EDM の Version 2.2 が必要です。 詳細については、「Streaming Provider (WCF Data Services)」を参照してください。

次の例の PhotoInfo エンティティは、HasStream 属性で示されている関連するメディア リソースと、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>

このトピックのその他の例では、メディア リソース ストリームにアクセスし変更する方法を紹介します。 .NET Framework クライアント アプリケーションで WCF Data Services クライアント ライブラリを使用してメディア リソース ストリームを使用する方法の完全な例については、ブログの記事「クライアントからメディア リソース ストリームへのアクセス」を参照してください。

バイナリ リソース ストリームへのアクセス

WCF Data Services クライアント ライブラリには、OData ベースのデータ サービスからのバイナリ リソース ストリームにアクセスするためのメソッドが用意されています。 メディア リソースをダウンロードするときには、メディア リソースの URI を使用することも、メディア リソース データ自体を含むバイナリ ストリームを取得することもできます。 メディア リソース データをバイナリ ストリームとしてアップロードすることもできます。

ヒント

写真を格納している OData サービスからバイナリ画像ファイルをダウンロードする Windows Presentation Foundation (WPF) クライアント アプリケーションの作成方法の例については、ブログの記事「Data Services ストリーミング プロバイダー シリーズ - パート 2: クライアントからメディア リソース ストリームへのアクセス」を参照してください。このブログ記事で取り上げられているストリーミング フォト データ サービスのサンプル コードをダウンロードするには、MSDN コード ギャラリーの「ストリーミング フォト データ サービスのサンプル」を参照してください。

バイナリ ストリームの URI の取得

画像やその他のメディア ファイルなど、取得するメディア リソースの種類によっては、アプリケーションでメディア リソースの URI を使用する方がバイナリ データ ストリーム自体を処理するよりも簡単です。 特定のメディア リンク エントリに関連付けられているリソース ストリームの URI を取得するには、そのエンティティを追跡している GetReadStreamUri(Object) インスタンスの DataServiceContext メソッドを呼び出す必要があります。 名前付きリソース ストリームの URI を取得するには、name パラメーターを受け取るメソッド オーバー ロードを呼び出します。このパラメーターの値は、ストリームの名前です。 次の例は、クライアントで新しい画像を作成するために使用するメディア リソース ストリームの URI を取得するために GetReadStreamUri(Object) メソッドを呼び出す方法を示しています。

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

名前付きリソース ストリームでは、ストリームの URI をストリーム プロパティから直接取得することもできます。 データ サービス メタデータから返される、Stream 型のメディア リンク エントリのプロパティごとに、データ サービス ツールで、DataServiceStreamLink インスタンスを返すプロパティが生成されます。 この DataServiceStreamLinkUri プロパティは、名前付きリソース ストリームの URI です。 そのため、メディア リンク エントリ オブジェクトから直接、または統合言語クエリ (LINQ) の結果として、URI を取得できます。

バイナリ リソース ストリームのダウンロード

バイナリ リソース ストリームを取得する場合、メディア リンク エントリを追跡している DataServiceContext インスタンスの GetReadStream メソッドを呼び出す必要があります。 このメソッドは、DataServiceStreamResponse オブジェクトを返すデータ サービスに要求を送信します。このオブジェクトは、リソースが含まれるストリームを参照します。 アプリケーションでバイナリ リソースを Stream として取得する必要がある場合にこのメソッドを使用します。 名前付きリソース ストリームにアクセスする場合は、name パラメーターを受け取るメソッド オーバー ロードを呼び出します。このパラメーターの値は、リソース ストリームの名前です。 次の例は、クライアントで新しい画像を作成するために使用するストリームを取得するために GetReadStream メソッドを呼び出す方法を示しています。

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

注意

バイナリ ストリームを含む応答メッセージの Content-Length ヘッダーは、このデータ サービスによって設定されません。この値は、バイナリ データ ストリームの実際の長さを反映していない場合があります。

ストリームとしてのメディア リソースのアップロード

メディア リソースを挿入または更新するには、エンティティを追跡している DataServiceContext インスタンスの SetSaveStream メソッドを呼び出します。 このメソッドは、指定ストリームから読み込まれたメディア リソースを含むデータ サービスに要求を送信します。 名前付きリソース ストリームをアップロードする場合は、name パラメーターを受け取るメソッド オーバー ロードを呼び出します。このパラメーターの値は、リソース ストリームの名前です。 次の例では、SetSaveStream メソッドを呼び出して、特定の従業員に属するビットマップ画像をデータ サービスに送信する方法を示します。

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

この例では、closeStream パラメーターに値 true を指定して SetSaveStream メソッドを呼び出しています。 したがって、必ず、バイナリ データがデータ サービスにアップロードされた後で DataServiceContext がストリームを閉じます。

注意

SetSaveStream(Object, String, Stream, Boolean, String) を呼び出すときには、SaveChanges が呼び出されるまでストリームはデータ サービスに送信されないことに注意してください。

関連項目

概念

コントロールへのデータのバインド (WCF Data Services)

その他の技術情報

データ クライアント (WCF Data Services)