Trabajar con datos binarios (Servicios de datos de WCF)
La biblioteca de cliente de WCF Data Services le permite recuperar y actualizar los datos binarios de una fuente Open Data Protocol (OData) de una de las siguientes formas:
Como una propiedad del tipo primitivo de una entidad. Este es el método recomendado para trabajar con objetos de datos binarios pequeños que se pueden cargar con facilidad en la memoria. En este caso, la propiedad binaria es una propiedad de entidad expuesta por el modelo de datos y el servicio de datos serializa los datos binarios como XML codificado binario de base 64 en el mensaje de respuesta.
Como flujo de recursos binarios independiente. Este es el método recomendado para obtener acceso y cambiar datos de objetos binarios grandes (BLOB) que pueden representar una foto, un vídeo o cualquier otro tipo de datos codificados binarios.
WCF Data Services implementa la transmisión por secuencias de datos binarios mediante HTTP como se define en OData . En este mecanismo, los datos binarios se tratan como recurso multimedia independiente de una entidad pero está relacionado con ella, que se denomina entrada de vínculo multimedia. Para obtener más información, vea Proveedores de transmisión por secuencias (WCF Data Services).
Sugerencia: |
---|
Para obtener un ejemplo paso a paso de cómo crear una aplicación cliente de Windows Presentation Foundation (WPF) que descargue archivos de imágenes binarias desde un servicio de OData que almacene fotos, vea la entrada de blog relacionada con la parte 2 del programa de proveedores de transmisión por secuencias de servicios de datos: acceso a un flujo de recursos multimedia desde el cliente. Para descargar el código muestra para el servicio de datos de fotos de transmisión por secuencias incluido en la entrada de blog, vea el ejemplo del servicio de datos de fotografía de transmisión por secuencias de la galería de código de MSDN. |
Metadatos de entidad
Una entidad que tenga un flujo de recursos multimedia relacionado se indica en los metadatos del servicio de datos mediante el atributo HasStream aplicado a un tipo de entidad que sea la entrada de vínculo multimedia. En el siguiente ejemplo, la entidad PhotoInfo
es una entrada de vínculo multimedia con un recurso multimedia relacionado, indicado por el atributo 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>
En el resto de los ejemplos de este tema se muestra cómo acceder y cambiar el flujo de recursos multimedia. Para obtener un ejemplo completo sobre cómo consumir un flujo de recursos multimedia en una aplicación cliente de .NET Framework mediante el uso de la biblioteca cliente de WCF Data Services , vea la entrada de blog relacionada con el acceso a un flujo de recursos multimedia desde el cliente.
Acceder al flujo de recursos binarios
La biblioteca cliente de WCF Data Services proporciona métodos para acceder a flujos de recursos binarios desde un servicio de datos basado en OData . Cuando se descarga un recurso multimedia, puede usar el URI de dicho recurso u obtener un flujo binario que contenga los datos del propio recurso multimedia. También puede cargar los datos del recurso multimedia como flujo binario.
Sugerencia: |
---|
Para obtener un ejemplo paso a paso de cómo crear una aplicación cliente de Windows Presentation Foundation (WPF) que descargue archivos de imágenes binarias desde un servicio de OData que almacene fotos, vea la entrada de blog relacionada con la parte 2 del programa de proveedores de transmisión por secuencias de servicios de datos: acceso a un flujo de recursos multimedia desde el cliente. Para descargar el código muestra para el servicio de datos de fotos de transmisión por secuencias incluido en la entrada de blog, vea el ejemplo del servicio de datos de fotografía de transmisión por secuencias de la galería de código de MSDN. |
Obtener el URI del flujo binario
Cuando se recuperan ciertos tipos de recursos multimedia, como imágenes y otros archivos multimedia, suele ser más fácil usar el URI del recurso multimedia de la aplicación que administrar el propio flujo de datos binarios. Para obtener el URI de un flujo de recursos asociado con una entrada de vínculo multimedia determinada, debe llamar al método GetReadStreamUri de la instancia de la clase DataServiceContext que esté realizando el seguimiento de la entidad. En el ejemplo siguiente se muestra cómo llamar al método GetReadStreamUri para obtener el URI de un flujo de recursos multimedia que se use con el fin de crear una nueva imagen en el cliente:
' 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));
Descargar el flujo de recursos binarios
Al recuperar un flujo de recursos multimedia, es necesario llamar al método GetReadStream de la instancia de la clase DataServiceContext que esté realizando el seguimiento de la entrada de vínculo multimedia. Este método envía una solicitud al servicio de datos que devuelve un objeto DataServiceStreamResponse, que tiene una referencia al flujo que contiene el recurso. Use este método cuando la aplicación necesite el recurso binario como clase Stream. En el ejemplo siguiente se muestra cómo llamar al método GetReadStream para recuperar un flujo que se use con el fin de crear una nueva imagen en el cliente:
Nota: |
---|
El servicio de datos no establece el encabezado de longitud de contenido del mensaje de respuesta que contiene el flujo binario. Este valor puede no reflejar la longitud real del flujo de datos binarios. |
Cargar un recurso multimedia como flujo
Para insertar o actualizar un recurso multimedia, llame al método SetSaveStream de la instancia de la clase DataServiceContext que esté realizando el seguimiento de la entidad. Este método envía una solicitud al servicio de datos que contiene el recurso multimedia leído desde el flujo proporcionado. En el siguiente ejemplo se muestra cómo llamar al método SetSaveStream para enviar una imagen al servicio de datos:
' 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);
En este ejemplo, se llama al método SetSaveStream proporcionando un valor true para el parámetro closeStream. De esta forma, se garantiza que la clase DataServiceContext cierre el flujo una vez cargados los datos binarios en el servicio de datos.
Nota: |
---|
Cuando llame al método SetSaveStream, el flujo no se envía al servicio de datos hasta que se llame al método SaveChanges. |
Vea también
Conceptos
Enlazar datos a controles (WCF Data Services)