Trabajar con datos binarios (Servicios de datos de WCF)

La biblioteca de cliente de Servicios de datos de Microsoft WCF 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.

Servicios de datos de Microsoft WCF implementa la transmisión por secuencias de datos binarios mediante HTTP como se define en el protocolo OData. OData proporciona los siguientes mecanismos de transmisión de datos para asociar datos binarios a una entidad:

  • Recurso multimedia/entrada de vínculo multimedia

    El protocolo de publicación Atom (AtomPub) define un mecanismo para asociar datos binarios como un recurso multimedia con una entrada de una fuente de datos, que se denomina la entrada de vínculo multimedia. Solo puede haber un recurso multimedia definido para una entrada de vínculo multimedia determinada. Un recurso multimedia puede ser considerado como el flujo predeterminado de una entidad. OData hereda este comportamiento de transmisión de datos de AtomPub.

  • Flujo de recursos con nombre

    A partir de la versión 3 de OData, una entidad puede tener varios flujos de recursos relacionados, a los que se tiene acceso por nombre. Este mecanismo no depende de AtomPub, por lo que es posible que una entidad tenga flujos de recursos con nombre y no sea una entrada de vínculo multimedia. También es posible que una entrada de vínculo multimedia tenga flujos con nombre. Para obtener más información, vea Proveedores de transmisión por secuencias (WCF Data Services).

Metadatos de entidad

Una entidad que tiene flujos de recursos binarios relacionados se indica en los metadatos del servicio de datos en una de las siguientes maneras, dependiendo del tipo de flujo:

  1. Recurso multimedia:

    Por el atributo HasStream un tipo de entidad que es la entrada de vínculo multimedia.

  2. Flujo de recursos con nombre:

    Por una o más propiedades de una entidad del modelo de datos que son del tipo de datos Stream.

    La compatibilidad con el tipo de datos Stream en el modelo de datos requiere la versión 2.2 del EDM. Para obtener más información, vea Streaming Provider (WCF Data Services).

En el siguiente ejemplo, la entidad PhotoInfo es una entrada de vínculo multimedia que tiene un recurso multimedia relacionado, indicado por el atributo HasStream, y un flujo de recursos con nombre, denominado 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>

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 Servicios de datos de Microsoft WCF, vea la entrada de blog relacionada con el acceso a un flujo de recursos multimedia desde el cliente.

Obtener acceso a los flujos de recursos binarios

La biblioteca cliente de Servicios de datos de Microsoft WCF 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(Object) de la instancia de la clase DataServiceContext que esté realizando el seguimiento de la entidad. Para obtener el URI de un flujo de recursos con nombre, llame a la sobrecarga del método que toma un parámetro name, que es el nombre del flujo. En el ejemplo siguiente se muestra cómo llamar al método GetReadStreamUri(Object) 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));

Para los flujos de recursos con nombre, también puede obtener el URI del flujo directamente de la propiedad del flujo. Para cada propiedad de la entrada de vínculo multimedia devuelta por los metadatos del servicio de datos que es de un tipo Stream, en las herramientas del servicio de datos genere una propiedad que devuelve una instancia DataServiceStreamLink. La propiedad Uri de este DataServiceStreamLink es el URI del flujo de recursos con nombre. Esto le permite obtener directamente el URI del objeto de entrada de vínculo multimedia o como el resultado de Language Integrated Query (LINQ).

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. Al tener acceso a un flujo de recursos con nombre, llame a la sobrecarga del método que toma un parámetro name, que es el nombre del flujo de recursos. 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:

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

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. Al cargar un flujo de recursos con nombre, llame a la sobrecarga del método que toma un parámetro name, que es el nombre del flujo de recursos. En el siguiente ejemplo se muestra cómo llamar al método SetSaveStream para enviar al servicio de datos una imagen de mapa de bits que pertenece a un empleado concreto:

' 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(Object, String, Stream, Boolean, String), 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)

Otros recursos

Cliente de datos (WCF Data Services)