이진 데이터로 작업(WCF Data Services)
WCF Data Services 클라이언트 라이브러리를 사용하면 다음 방법 중 하나로 Open Data Protocol(OData) 피드에서 이진 데이터를 검색하고 업데이트할 수 있습니다.
엔터티의 기본 형식 속성으로. 이 방법은 메모리에 쉽게 로드할 수 있는 작은 이진 데이터 개체로 작업하는 경우 권장됩니다. 이 경우 이진 속성은 데이터 모델에서 노출하는 엔터티 속성이며, 데이터 서비스는 이진 데이터를 응답 메시지에서 base-64 이진 인코딩 XML로 serialize합니다.
별도의 이진 리소스 스트림으로. 이 방법은 사진, 비디오 또는 다른 형식의 이진 인코딩 데이터를 나타낼 수 있는 BLOB(Binary Large Object) 데이터에 액세스하고 변경하는 경우 권장됩니다.
WCF Data Services는 OData 프로토콜에 정의된 대로 HTTP를 사용하여 이진 데이터의 스트리밍을 구현합니다. OData는 엔터티에 이진 데이터를 연결하기 위해 다음과 같은 스트리밍 메커니즘을 제공합니다.
미디어 리소스/미디어 링크 항목
AtomPub(Atom 게시 프로토콜)은 미디어 링크 항목이라고 하는 데이터 피드의 항목에 미디어 리소스로 이진 데이터를 연결하는 메커니즘을 정의합니다. 지정된 미디어 링크 항목에 하나의 미디어 리소스만 정의할 수 있습니다. 미디어 리소스는 엔터티에 대한 기본 스트림으로 간주할 수 있습니다. OData는 AtomPub에서 이 스트리밍 동작을 상속합니다.
명명된 리소스 스트림
OData 버전 3부터는 엔터티가 이름으로 액세스하는 여러 관련 리소스 스트림을 가질 수 있습니다. 이 메커니즘은 AtomPub에 의존하지 않으므로 엔터티가 명명된 리소스 스트림을 가질 수 있고 미디어 링크 항목이 아니어도 됩니다. 또한 미디어 링크 항목이 명명된 스트림을 가질 수도 있습니다. 자세한 내용은 스트리밍 공급자(WCF Data Services)를 참조하십시오.
엔터티 메타데이터
관련 이진 리소스 스트림을 가진 엔터티는 스트림 종류에 따라 다음 중 한 가지 방법으로 데이터 서비스 메타데이터에 표시됩니다.
미디어 리소스:
HasStream 특성에 따라 미디어 링크 항목인 엔터티 형식입니다.
명명된 리소스 스트림:
데이터 모델의 엔터티의 하나 이상의 속성에 따라 데이터 형식이 Stream입니다.
데이터 모델에서 Stream 데이터 형식을 지원하려면 버전 2.2의 EDM이 필요합니다. 자세한 내용은 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>
이 항목의 나머지 예제에서는 미디어 리소스 스트림에 액세스하고 변경하는 방법을 보여 줍니다. WCF Data Services 클라이언트 라이브러리를 사용하여 .NET Framework 클라이언트 응용 프로그램에서 미디어 리소스 스트림을 사용하는 방법의 전체 예제는 클라이언트에서 미디어 리소스 스트림에 액세스 게시물을 참조하십시오.
이진 리소스 스트림 액세스
WCF Data Services 클라이언트 라이브러리에서는 OData 기반 데이터 서비스에서 이진 리소스 스트림에 액세스하는 방법을 제공합니다. 미디어 리소스를 다운로드할 때 미디어 리소스의 URI를 사용하거나 미디어 리소스 데이터 자체가 포함된 이진 스트림을 가져올 수 있습니다. 또한 미디어 리소스 데이터를 이진 스트림으로 업로드할 수도 있습니다.
팁
사진을 저장하는 OData 서비스에서 이전 이미지 파일을 다운로드하는 WPF(Windows Presentation Foundation) 클라이언트 응용 프로그램을 만드는 방법의 단계별 예제를 보려면 데이터 서비스 스트리밍 공급자 시리즈-2부: 클라이언트에서 미디어 리소스 스트림에 액세스 게시물을 참조하십시오.블로그 게시물에 나오는 스트림 사진 데이터 서비스에 대한 샘플 코드를 다운로드하려면 MSDN 코드 갤러리(MSDN Code Gallery)의 스트리밍 사진 데이터 서비스 샘플을 참조하십시오.
이진 스트림의 URI 가져오기
이미지 및 기타 미디어 파일과 같은 특정 유형의 미디어 리소스를 검색할 때 이진 데이터 스트림 자체를 처리하는 것보다 응용 프로그램에 있는 미디어 리소스의 URI를 사용하는 것이 쉬운 경우가 많습니다. 특정 미디어 링크 항목과 연결된 리소스 스트림의 URI를 가져오려면 엔터티를 추적하는 DataServiceContext 인스턴스에서 GetReadStreamUri(Object) 메서드를 호출해야 합니다. 명명된 리소스 스트림의 URI를 가져오려면 스트림 이름인 name 매개 변수를 사용하는 메서드 오버로드를 호출합니다. 다음 예제에서는 GetReadStreamUri(Object) 메서드를 호출하여 클라이언트에서 새 이미지를 만드는 데 사용되는 미디어 리소스 스트림의 URI를 가져오는 방법을 보여 줍니다.
' 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 인스턴스를 반환하는 속성을 만듭니다. 이 DataServiceStreamLink의 Uri 속성은 명명된 리소스 스트림의 URI입니다. 미디어 링크 항목 개체에서 URI를 직접 가져오거나 LINQ(Language Integrated Query)의 결과로 가져올 수 있습니다.
이진 리소스 스트림 다운로드
이진 리소스 스트림을 검색할 때 미디어 링크 항목을 추적하는 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);
이 예제에서 SetSaveStream 메서드는 closeStream 매개 변수에 true 값을 제공하여 호출됩니다. 이렇게 하면 이진 데이터가 데이터 서비스로 업로드된 후 DataServiceContext가 스트림을 닫습니다.
참고
SetSaveStream(Object, String, Stream, Boolean, String)을 호출하면 SaveChanges를 호출할 때까지 데이터 서비스로 스트림이 전송되지 않습니다.
참고 항목
개념
컨트롤에 데이터 바인딩(WCF Data Services)