Compartir a través de


Crear aplicaciones de Silverlight (WCF Data Services)

Importante

La biblioteca cliente de Servicios de datos de Microsoft WCF 5.0 para Silverlight no se admite para aplicaciones de Windows Phone.En su lugar debe usar la Biblioteca cliente de OData para Windows Phone, que está incluida en el SDK de Windows Phone 7.1.Para obtener más información, vea Descripción general de Open Data Protocol (OData) para Windows Phone.Actualmente no hay ninguna biblioteca cliente para Windows Phone que admita OData v3.

La biblioteca cliente de Servicios de datos de Microsoft WCF para Silverlight genera solicitudes HTTP en un servicio de datos que admite la versión 3 del protocolo OData y transforma los datos de la fuente de respuestas de OData en objetos en el cliente. Las dos clases principales de la biblioteca cliente son DataServiceContext y DataServiceQuery<TElement>. La clase DataServiceContext encapsula las operaciones que se ejecutan en un servicio de datos especificado. Los servicios basados en OData no tienen estados. Sin embargo, DataServiceContext mantiene el estado de las entidades en el cliente entre las interacciones con el servicio de datos. Esto permite al cliente admitir características como seguimiento de cambios y administración de identidades. La clase DataServiceQuery<TElement> representa una consulta en un conjunto de entidades concreto. Para obtener más información, vea Usar un servicio de datos en una aplicación de .NET Framework (WCF Data Services). Para ver un ejemplo en funcionamiento de una aplicación que consume una fuente del servicio de datos de ejemplo Northwind, vea el Tutorial rápido de WCF Data Services para Silverlight

Nota

Cuando se usa la biblioteca cliente de Servicios de datos de Microsoft WCF para Silverlight, todas las solicitudes al servicio se realizan de forma asincrónica.Para obtener más información, vea Operaciones asincrónicas (WCF Data Services).

Este tema contiene las siguientes secciones:

Generar clases cliente del servicio de datos

Puede usar el cuadro de diálogo Agregar referencia de servicio de Visual Studio para agregar una referencia a cualquier servicio que expone una fuente de OData. Para obtener más información, vea Generar las clases cliente del servicio de datos (WCF Data Services). Las clases cliente del servicio de datos también se pueden generar usando la herramienta DataSvcUtil.exe en el símbolo del sistema. Para obtener más información, vea Cómo: Generar manualmente clases del servicio de datos del cliente (WCF Data Services).

Nota

Cuando se instale Servicios de datos de Microsoft WCF 5.0, la herramienta Agregar referencia de servicio agregará automáticamente una referencia a la versión de Microsoft.Data.Services.Client.SL.dll de la biblioteca cliente en lugar de agregar una referencia a la versión de System.Data.Services.Client.dll incluida en Silverlight.Si por alguna razón necesita usar la versión anterior del cliente de Silverlight, debe agregar manualmente una referencia a la versión de Silverlight de la biblioteca cliente.Para obtener más información, vea Cómo: Generar manualmente clases del servicio de datos del cliente (WCF Data Services).

Obtener acceso a recursos y modificarlos

En una aplicación basada en Silverlight, todas las operaciones sobre un servicio de datos son asincrónicas. Puede realizar operaciones asincrónicas usando pares de métodos de las clases DataServiceQuery<TElement> y DataServiceContext cuyos nombres comienzan por Begin y End, respectivamente. Los métodos Begin registran un delegado al que llama el servicio cuando se completa la operación. Se debe llamar a los métodos End en el delegado registrado para controlar la devolución de llamada desde las operaciones completadas. Cuando llame al método End para completar una operación asincrónica, debe hacerlo desde la misma instancia de DataServiceQuery<TElement> o DataServiceContext que usó para comenzar la operación. Cada método Begin toma un parámetro state que puede pasar un objeto de estado a la devolución de llamada. Este objeto de estado se recupera como la interfaz IAsyncResult que se proporciona con la devolución de llamada y se usa para llamar al método End correspondiente para completar la operación asincrónica. Por ejemplo, cuando se proporciona la instancia de DataServiceQuery<TElement> como parámetro state al llamar al método BeginExecute de la instancia, se devuelve la misma instancia de IAsyncResult que DataServiceQuery<TElement>. A continuación, esta instancia de DataServiceQuery<TElement> se usa para llamar al método EndExecute para completar la operación de consulta. Para obtener más información, vea Operaciones asincrónicas (WCF Data Services).

Puesto que la biblioteca cliente de Servicios de datos de Microsoft WCF para Silverlight obtiene acceso al servicio de datos asincrónicamente usando protocolos de red, debe usar el método BeginInvoke de la clase Dispatcher para calcular las referencias correctamente de la operación de respuesta al subproceso principal de la aplicación (el subproceso de la interfaz de usuario) de la aplicación basada en Silverlight. Para obtener más información, vea Synchronizing Data for Multithreading.

Consultar recursos

La biblioteca cliente de Servicios de datos de Microsoft WCF para Silverlight le permite ejecutar consultas en un servicio de datos de OData mediante los conocidos modelos de programación de .NET Framework, incluido el uso de Language-Integrated Query (LINQ). Cuando se llama al método BeginExecute en DataServiceQuery<TElement> o DataServiceContext, la biblioteca cliente convierte una consulta o un Identificador uniforme de recursos (URI) en un mensaje de solicitud HTTP GET. La biblioteca cliente recibe el mensaje de respuesta correspondiente y lo traduce en instancias de las clases del servicio de datos cliente. El seguimiento de estas clases lo realiza la clase DataServiceContext a la que pertenece DataServiceQuery<TElement>. Para obtener más información, vea Cómo: Ejecutar consultas de servicio de datos asincrónicos (WCF Data Services).

En algunos escenarios, es útil saber el número total de entidades de un conjunto de entidades y no solamente el número que hay en la fuente devuelto por la consulta. Llame al método IncludeTotalCount de DataServiceQuery<TElement> para solicitar que se incluya este recuento total de entidades del conjunto con los resultados de la consulta. En este caso, la propiedad TotalCount del objeto QueryOperationResponse<T> devuelto devuelve el número total de entidades del conjunto. También puede usar el método AddQueryOption para agregar a una consulta cualquiera de las demás opciones de consulta que OData admite. Para obtener más información, vea Consultar el servicio de datos (WCF Data Services).

Consultas LINQ

Puesto que la clase DataServiceQuery<TElement> implementa la interfaz IQueryable<T> definida por LINQ, la biblioteca cliente de Servicios de datos de Microsoft WCF para Silverlight puede transformar consultas LINQ sobre datos del conjunto de entidades en un URI que representa una expresión de consulta evaluada en un recurso del servicio de datos. Por ejemplo, la siguiente consulta LINQ devuelve una fuente que es una colección de entidades Order filtradas por el valor de propiedad CustomerID proporcionado por el usuario en el cuadro de texto customerId.

' Define a query that returns orders for a give customer.
Dim query = From orderByCustomer In context.Orders _
                Where orderByCustomer.Customer.CustomerID = _
                Me.customerId.Text _
                Select orderByCustomer
// Define a query that returns orders for a give customer.
var query = from orderByCustomer in context.Orders
            where orderByCustomer.Customer.CustomerID == this.customerId.Text
            select orderByCustomer;

Cargar contenido aplazado

De forma predeterminada, Servicios de datos de Microsoft WCF limita la cantidad de datos que devuelve una consulta. Sin embargo, es posible cargar explícitamente datos adicionales, incluidos los datos de la respuesta paginados, las entidades relacionadas y los flujos de datos binarios, del servicio de datos cuando sea necesario. Cuando se ejecuta una consulta, solo se devuelven las entidades pertenecientes al conjunto de entidades direccionado. Por ejemplo, cuando una consulta al servicio de datos Northwind devuelve entidades Customers, no se devuelven de forma predeterminada las entidades Orders relacionadas aunque haya una relación entre Customers y Orders. Las entidades relacionadas se pueden cargar con la consulta original (carga diligente) o por entidad (carga explícita). Para obtener más información, vea Cargar contenido aplazado (WCF Data Services). Cuando se usa el cliente de Silverlight y DataServiceCollection<T>, es posible cargar colecciones de entidades relacionadas desde una propiedad de navegación si se llama al método LoadAsync.

Sugerencia

A la hora de decidir un modelo para cargar entidades relacionadas, tenga en cuenta la contrapartida de rendimiento entre el tamaño del mensaje y el número de solicitudes realizadas al servicio de datos.

Cuando la paginación está habilitada en el servicio de datos, debe cargar explícitamente las páginas de datos subsiguientes desde el servicio de datos cuando el número de entradas devueltas supera el límite de paginación. Como no es posible determinar de antemano cuándo puede producirse la paginación, se recomienda permitir que la aplicación cliente de Silverlight controle correctamente una fuente de OData paginada. Para obtener ejemplos de cómo controlar una respuesta paginada, vea Cómo: Enlazar datos del servicio de datos a controles (Cliente de Silverlight) y Consultar el servicio de datos (WCF Data Services).

Proyección de consultas

La proyección proporciona un mecanismo para reducir la cantidad de datos de la fuente de OData devueltos por una consulta especificando que solo se devuelvan determinadas propiedades de una entidad en la respuesta. Para obtener más información, vea OData: opción de consulta del sistema de selección ($select). Puede agregar una cláusula de proyección a una consulta LINQ mediante la cláusula select (Select en Visual Basic). Los datos de entidad devueltos se pueden proyectar en tipos de entidad o en tipos que no son de entidad en el cliente. Los cambios realizados en tipos que no son de entidad no se pueden guardar en el servicio de datos. Por ejemplo, la siguiente consulta LINQ proyecta datos de Customer en un nuevo tipo de entidad CustomerAddress en el cliente.

Dim query = From c In context.Customers _
                    Where c.Country = "Germany" _
                    Select New CustomerAddress With
                        {.CustomerID = c.CustomerID, _
                         .Address = c.Address, _
                         .City = c.City, _
                         .PostalCode = c.PostalCode, _
                         .Country = c.Country _
                        }
var query = from c in context.Customers
            where c.Country == "Germany"
            select new CustomerAddress
            {
                CustomerID = c.CustomerID,
                Address = c.Address,
                City = c.City,
                PostalCode = c.PostalCode,
                Country = c.Country
            };

Importante

Se puede producir una pérdida de datos en el servicio de datos cuando se guardan actualizaciones efectuadas en tipos proyectados.Para obtener más información, vea Consideraciones sobre proyecciones en la documentación del cliente de Servicios de datos de Microsoft WCF.

Para obtener más información, vea Cómo: Proyectar los resultados de una consulta de servicio de datos (Cliente de Silverlight).

Modificar recursos y guardar cambios

El cliente realiza un seguimiento de los cambios en las entidades que se notifican ejecutando manualmente los métodos siguientes en DataServiceContext:

Estos métodos permiten al cliente realizar el seguimiento de las entidades agregadas y eliminadas y también de los cambios que se realizan en los valores de propiedad o en las relaciones entre instancias de entidad. Cuando usa el cuadro de diálogo Agregar referencia de servicio para generar clases del servicio de datos cliente, también se crea un método AddTo para cada entidad de la clase DataServiceContext generada. Use estos métodos para agregar una nueva instancia de entidad a un conjunto de entidades y notificar la adición al contexto. Estos cambios realizados se devuelven al servicio de datos de forma asincrónica cuando llama a los métodos BeginSaveChanges y EndSaveChanges.

Cuando agrega una entidad nueva mediante el método AddObject o el método AddTo apropiado, las relaciones entre la nueva entidad y las entidades relacionadas no se definen automáticamente. Puede crear y cambiar las relaciones entre las instancias de las entidades y hacer que la biblioteca de cliente refleje esos cambios en el servicio de datos. Las relaciones entre las entidades se definen como asociaciones en el modelo y la clase DataServiceContext realiza el seguimiento de cada relación como objeto de vínculo en el contexto. Servicios de datos de Microsoft WCF proporciona los métodos siguientes en la clase DataServiceContext para crear, modificar y eliminar estos vínculos:

Para obtener más información, vea Actualizar el servicio de datos (WCF Data Services).

Trabajar con datos binarios

OData define un mecanismo para obtener acceso a datos binarios independientemente de una entidad a la que pertenecen. De esta forma, un servicio de OData puede exponer datos binarios grandes como un recurso multimedia que pertenece a una entrada de vínculo multimedia. El cliente de Servicios de datos de Microsoft WCF para Silverlight puede consumir un recurso multimedia de un servicio de OData como un flujo binario. Para obtener acceso al flujo binario, llame al método BeginGetReadStream en la instancia de DataServiceContext que está realizando el seguimiento de la entidad que es la entrada de vínculo multimedia. Este método asincrónico devuelve un objeto DataServiceStreamResponse cuando se llama al método EndGetReadStream en la instancia de DataServiceContext devuelta por la devolución de llamada. Del mismo modo, se envía un recurso multimedia al servicio de OData cuando se llama al método SetSaveStream y después de llamar a los métodos BeginSaveChanges y EndSaveChanges. Para obtener más información, vea Cómo: Obtener acceso a datos binarios como un flujo (Cliente de Silverlight).

Enlace de datos

El cliente de Servicios de datos de Microsoft WCF para Silverlight admite enlazar datos a controles mediante la clase DataServiceCollection<T>. Esta clase, que hereda de ObservableCollection<T>, representa una colección de datos dinámicos que proporciona notificaciones cuando se agregan o quitan datos de la colección. Estas notificaciones permiten al DataServiceContext hacer un seguimiento de los cambios automáticamente sin tener que llamar explícitamente a los métodos de seguimiento de cambios. Una DataServiceCollection<T> se define basándose a una DataServiceQuery<TElement>. Esta consulta, cuando se ejecuta, proporciona los objetos para la colección.

El método LoadAsync se emplea para ejecutar asincrónicamente la consulta y cargar los resultados en la colección. Este método asegura que se calculen las referencias de los resultados en el subproceso correcto, de forma que no necesite usar Dispatcher. Cuando se usa una instancia de DataServiceCollection<T> para el enlace de datos, el cliente se asegura de que los objetos de los que DataServiceContext realiza un seguimiento sigan estando sincronizados con los datos en el elemento de la interfaz de usuario enlazada. No es necesario notificar manualmente los cambios en entidades en una colección de enlace a DataServiceContext. Para obtener más información, vea Cómo: Enlazar datos del servicio de datos a controles (Cliente de Silverlight).

Ejecución entre dominios

Silverlight le permite obtener acceso a servicios hospedados en un dominio diferente. Este tipo de acceso se debe habilitar explícitamente implementando un archivo de directiva entre dominios en el servidor. Esta funcionalidad está incluida en la implementación HTTP del cliente de Silverlight.

Nota

Antes de permitir que los clientes de Silverlight obtengan acceso a servicios web entre dominios, debe tener en cuenta algunas consideraciones de seguridad importantes.Para obtener más información, vea HTTP Communication and Security with Silverlight.

Para la mayoría de las solicitudes a un servicio de datos, el cliente de Servicios de datos de Microsoft WCF para Silverlight usa una implementación XMLHTTP. Sin embargo, cuando el cliente de Servicios de datos de Microsoft WCF detecta una solicitud entre dominios, cambia automáticamente para usar la implementación HTTP del cliente de Silverlight.

Nota

El cliente cambiará automáticamente a la implementación HTTP solo cuando la propiedad HttpStack esté establecida en Auto.

Para obtener un ejemplo de cómo configurar un servicio de datos para permitir solicitudes entre dominios de una aplicación basada en Silverlight, vea la entrada de blog Usar el cliente de Silverlight de ADO.NET Data Services en escenarios entre dominios y fuera del explorador. La compatibilidad con la ejecución entre dominios es nueva en Silverlight 4.

Ejecución fuera del explorador

Puede configurar aplicaciones basadas en Silverlight de manera que los usuarios puedan instalarlas desde sus páginas web del host y ejecutarlas fuera del explorador. El cliente Servicios de datos de Microsoft WCF para for Silverlight admite la ejecución fuera del explorador. Cuando el cliente Servicios de datos de Microsoft WCF detecta que una aplicación se está ejecutando fuera del explorador, pasa automáticamente a usar la implementación HTTP del cliente de Silverlight. Este mismo comportamiento se produce con la ejecución entre dominios; sin embargo, no se necesita ningún archivo de directiva entre dominios. Para obtener más información, vea Out-of-Browser Support.

Autenticación del cliente

De forma predeterminada, el cliente Servicios de datos de Microsoft WCF para Silverlight realiza solicitudes al servicio de datos usando las mismas credenciales de cliente que el explorador web y es este el que administra la autenticación. Sin embargo, cuando el acceso al servicio de datos necesita una solicitud entre dominios o cuando la aplicación de Silverlight se ejecuta fuera del explorador web, puede especificar las credenciales proporcionadas al realizar la solicitud. En estos escenarios, el cliente usa automáticamente la implementación HTTP del cliente de Silverlight para realizar solicitudes y se usan las credenciales predeterminadas para la autenticación. Sin embargo, cuando la propiedad UseDefaultCredentials está establecida en false, el cliente usa la interfaz ICredentials asignada a la propiedad the Credentials al autenticarse con el servicio de datos.

Advertencia

Las credenciales de usuario solo se deben solicitar durante la ejecución y no se deben almacenar en memoria caché.Las credenciales se deben almacenar siempre de forma segura.

También puede suministrar credenciales si solicita que la aplicación use la implementación HTTP del cliente de Silverlight. Para ello, debe establece el valor de la propiedad HttpStack en ClientHttp. El código siguiente asegura que las credenciales recopiladas del usuario durante la ejecución se usen al obtener acceso al servicio de datos:

' Select the client HTTP stack and set the credentials.
context.HttpStack = HttpStack.ClientHttp
context.UseDefaultCredentials = False
context.Credentials = _
    New NetworkCredential(userName, password, domain)
// Select the client HTTP stack and set the credentials.
context.HttpStack = HttpStack.ClientHttp;
context.UseDefaultCredentials = false;
context.Credentials = 
    new NetworkCredential(userName, password, domain);

Cuando no se usa la implementación HTTP del cliente de Silverlight, al establecer el valor de la propiedad UseDefaultCredentials en false se producirá una excepción durante la ejecución. Cuando el valor de UseDefaultCredentials es true, se usan las credenciales predeterminadas aunque se haya establecido la propiedad Credentials.

Advertencia

Los datos enviados con la autenticación básica e implícita no se cifran. Por tanto, los puede ver un adversario.Además, las credenciales de autenticación básica (nombre de usuario y contraseña) se envían en texto no cifrado y se pueden interceptar.

Para obtener más información, vea Cómo: Especificar las credenciales del cliente para una solicitud de servicio de datos (Cliente de Silverlight). Para ver un ejemplo de cómo obtener acceso a un servicio de datos que usa autenticación de formularios ASP.NET desde una aplicación de Silverlight, vea el artículo Usar la biblioteca cliente de Silverlight de ADO.NET Data Services en escenarios entre dominios y fuera del explorador – II (Autenticación de formularios).