Share via


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

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

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

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

OData で定義されているように、WCF Data Services は HTTP を使用してバイナリ データのストリーミングを実装します。この場合、バイナリ データは、エンティティに関連しているものの、エンティティとは切り離されたメディア リソースとして処理されます。これをメディア リンク エントリといいます。詳細については、「ストリーミング プロバイダー (WCF Data Services)」を参照してください。

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

エンティティ メタデータ

メディア リソース ストリームが関連付けられているエンティティは、データ サービス メタデータで HasStream 属性によって示されます。この属性は、メディア リンク エントリであるエンティティ型に適用されます。次の例の PhotoInfo エンティティは、メディア リソースが関連付けられているメディア リンク エントリであり、HasStream 属性によってそのことが示されています。

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

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

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

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

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

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

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

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

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

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

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

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

メディア リソースを挿入または更新するには、エンティティを追跡している DataServiceContext インスタンスの SetSaveStream メソッドを呼び出します。このメソッドは、指定ストリームから読み込まれたメディア リソースを含むデータ サービスに要求を送信します。次の例は、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 がストリームを閉じます。

Ee473426.note(ja-jp,VS.100).gif注 :
SetSaveStream を呼び出すときには、SaveChanges が呼び出されるまでストリームはデータ サービスに送信されないことに注意してください。

参照

概念

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

その他のリソース

WCF Data Services クライアント ライブラリ