Instrucciones para OData en Windows Azure
Autor: Glenn Gailey
Revisor: Abhiram Chivukula
Este artículo resume el uso actual de OData en la plataforma de Windows Azure. También proporciona una guía para crear, implementar y usar los servicios de OData hospedados en Windows Azure.
En este tema se incluyen las secciones sobre instrucciones siguientes:
-
Información general: OData en la nube
-
Instrucciones para usar un proveedor de Entity Framework para conectarse a Base de datos SQL
-
Aprovechar el almacenamiento de blobs
-
Proteger un servicio de OData
-
Volver a publicar el servicio Tabla, no recomendado
-
Instrucciones para mejorar las aplicaciones del servicio de datos de WCF
-
Instrucciones para clientes de OData
En este artículo se da por sentado que está familiarizado con los servicios de datos de WCF y ADO.NET Entity Framework. Para obtener más información sobre estas tecnologías de .NET Framework, vea WCF Data Services y ADO.NET Entity Framework.
Información general: OData en la nube
Open Data Protocol (OData) es un protocolo basado en la transferencia representativa de estados (REST). Cuando se crean servicios de datos basados en la nube, cualquier cliente que admite mensajería HTTP y que pueda procesar XML o JSON podrá usar sus datos. OData expone datos como recursos que son direccionables mediante URI. Se tiene acceso a los datos y se cambian mediante los verbos HTTP de GET, PUT, POST y DELETE. OData utiliza las convenciones de relaciones de Entity Data Model para exponer recursos como conjuntos de entidades que se relacionan mediante asociaciones.
Dado que se basa en estándares de Internet, OData es una opción natural para crear servicios de datos basados en REST en la nube, que utiliza una amplia variedad de plataformas y dispositivos de cliente para Internet. Por tanto, existen muchas características de la plataforma de Windows Azure que utilizan OData, entre las que se incluyen:
- Servicio Tabla del Almacenamiento de Windows Azure
- La interfaz de programación que se utiliza para tener acceso al servicio de Windows Azure es OData. Puede tener acceso al servicio Tabla si compone manualmente las solicitudes HTTP. Para obtener más información, vea Table Service REST API. También puede utilizar un cliente de OData, como el cliente del Almacenamiento de Windows Azure o el cliente de servicios de datos de WCF para tener acceso al servicio de tabla. Para obtener más información, vea Using the .NET Client Library with the Table Service.
- Windows Azure Marketplace
- Windows Azure Marketplace es un mercado de aplicaciones basado en información de suscripción que simplifica las tareas de publicación y uso de datos desde varias fuentes. El mercado publica datos según los va suministrando OData, de forma que las aplicaciones compatibles con OData los puedan usar fácilmente. Para obtener más información, vea Windows Azure Marketplace.
- Servicio de administración de ACS
- Access Control Service (ACS) 2.0 de Windows Azure proporciona una API basada en OData para el servicio de administración de ACS. Para obtener más información, vea ACS Management Service API Reference.
También puede crear e implementar su propio servicio de OData en Windows Azure. En este caso, el servicio de datos es una aplicación web basada en .NET Framework que hospeda un rol web de ASP.NET. A continuación se indican las características y los kits de herramientas que le permiten crear e implementar servicios de OData en Windows Azure:
- Servicios de datos de Microsoft WCF
- Servicios de datos de WCF es un componente de .NET Framework que se utiliza para crear aplicaciones de servicio de datos que implementan OData. Para obtener más información, vea WCF Data Services. Servicios de datos de WCF permiten crear servicios de datos personalizados basados en Windows Azure que se hospedan como roles web de ASP.NET. Si usa servicios de datos de WCF, podrá exponer los datos que se originan a partir de varios orígenes de Windows Azure, que incluyen Base de datos SQL y el Almacenamiento de blobs de Windows Azure. El proveedor de servicios de datos que se utiliza para definir el modelo de datos del servicio de datos depende del origen de datos. Para obtener más información, vea Data Services Providers (WCF Data Services). Las Herramientas de Windows Azure para Visual Studio incluyen un conjunto integrado de herramientas para desarrollar servicios de datos basados en Windows Azure en Visual Studio. Para obtener un ejemplo de cómo utilizar las herramientas de Visual Studio para crear e implementar un servicio de datos para exponer las fuentes de OData desde Base de datos SQL, vea el artículo Servicios de datos en la nube. Para obtener instrucciones generales sobre la creación e implementación de servicios OData mediante servicios de datos de WCF, vea Defining WCF Data Services.
- Kit de herramientas de Sync Framework
- El kit de herramientas de Sync Framework amplía Microsoft Sync Framework para permitirle crear un servicio de sincronización basado en los servicios de datos de WCF que se pueden implementar en Windows Azure. Este servicio especializado de OData permite sincronizar datos entre Base de datos SQL y las diferentes aplicaciones y dispositivos cliente que puedan usar fuentes de OData. Para obtener más información, vea Página del proyecto del Kit de herramientas de Microsoft Sync Framework en la galería de código de MSDN.
Para obtener más información acerca del protocolo de OData, incluida una lista de productores y consumidores de OData y sobre las bibliotecas cliente que admiten OData, vea el sitio web OData.org.
Instrucciones para usar un proveedor de Entity Framework para conectarse a Base de datos SQL
Puede utilizar el proveedor de Entity Framework en los servicios de datos de WCF para crear un servicio de datos que publique datos de Base de datos SQL como fuentes de OData. Para obtener un ejemplo, vea How to: Connect to Windows Azure SQL Database Through WCF Data Services. Cuando se utiliza el proveedor de Entity Framework para definir el modelo de datos para el servicio de datos, los servicios de datos de WCF utilizan la clase proporcionada, que hereda de ObjectContext, para crear y ejecutar consultas en la base de datos. Para obtener más información, vea Entity Framework Provider (WCF Data Services).
Las instrucciones siguientes se aplican a las situaciones en las que se usa el proveedor de Entity Framework para permitir a los servicios de datos de WCF publicar datos desde Base de datos SQL.
Usar un proveedor Code First de Entity Framework
ADO.NET Entity Framework permite definir un modelo de datos utilizando un diseñador (Model First), asignando a una base de datos existente (Database First) y usando sus propios objetos de Common Language Runtime (CLR) (Code First). Para obtener más información, vea Creating and Mapping a Conceptual Model (Entity Framework). Code First se introduce con Entity Framework 4.1. Al igual que con Model First, el enfoque de Code First le permite definir un modelo de datos sin una Base de datos SQL existente. Code First genera automáticamente una nueva Base de datos SQL en el servidor de Base de datos SQL de destino. El tutorial Desarrollar una aplicación de datos de Windows Azure con Code First y Base de datos SQL de Windows Azure muestra cómo crear un modelo de datos Code First para una Base de datos SQL.
Cuando utilice Code First para definir el modelo de datos, estará definiendo una clase de contexto que herede de DbContext en lugar de ObjectContext. Sin embargo, cuando se utiliza el proveedor de Entity Framework con los servicios de datos de WCF, la clase DataService debe ser de un tipo que herede de ObjectContext. Hay una alternativa que permite usar un modelo de datos de Code First con los servicios de datos de WCF. Debe invalidar CreateDataSource para proporcionar explícitamente la ObjectContext subyacente al tiempo de ejecución de los servicios de datos. Para obtener un ejemplo de cómo hacerlo, vea el artículo Usar Code First de Entity Framework 4.1 con los servicios de datos de WCF.
Mitigar errores de conexión de Base de datos SQL
Cuando utilice Entity Framework para tener acceso a los datos de una Base de datos SQL, se recomienda intentar mitigar errores de conexión. Como se describe en el artículo Base de datos SQL de Windows Azure y administración de errores de conexión de Entity Framework, hay varias formas en las que puede mitigar los errores de conexión de Base de datos SQL cuando se utilice Entity Framework. No hay ningún mecanismo de reintento automático en Entity Framework ni en los servicios de datos de WCF. Al utilizar el proveedor de Entity Framework, los servicios de datos de WCF administran ObjectContext automáticamente. Esto significa que no hay manera alguna de transferir la lógica de reintento a operaciones individuales de Entity Framework. Por ello, en su lugar debe implementar la lógica de reintento para borrar el grupo de conexiones en cualquier conexión no válida que pudiera producir un error durante la ejecución.
Cuando se tiene un modelo de Model First o de Database First
Si utiliza las herramientas de Entity Framework para crear un modelo de datos de Model First o de Data First, las herramientas generan clases ObjectContext parciales fuertemente tipadas. Esta clase parcial incluye un método OnContextCreated parcial.
Para mitigar los errores de conexión, implemente el método siguiente en una página de códigos distinta en el proyecto de servicio de datos:
partial void OnContextCreated() { int MaxRetries = 10; int DelayMS = 100; RetryPolicy policy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>( MaxRetries, TimeSpan.FromMilliseconds(DelayMS)); // Invoke the query in an inline delegate using the lambda operator. policy.ExecuteAction(() => { try { // Try to open the connection. Connection.Open(); var storeConnection = (SqlConnection)((EntityConnection)Connection) .StoreConnection; // Send a quick query to the SQL database to test the connection. new SqlCommand("declare @i int", storeConnection).ExecuteNonQuery(); } catch (Exception ex) { // If we fail, close the connection. Connection.Close(); throw ex; } }); }
Este método proporciona una lógica de reintento cuando el contexto se crea para enviar consultas que no consuman muchos recursos a Base de datos SQL para borrar el grupo de conexiones. La lógica de reintento la proporciona la clase RetryPolicy en Bloqueo de aplicación para la administración de errores transitorios, que se incluye con el Paquete de integración de la biblioteca de información empresarial 5.0 para Windows Azure, noviembre de 2011. Este bloqueo de aplicación también está disponible como un paquete de Nuget. El ejemplo de código anterior necesita las instrucciones using siguientes:
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure; using Microsoft.Practices.TransientFaultHandling; using System.Data.EntityClient; using System.Data.SqlClient;
Cuando se tiene un modelo Code First
Cuando utilice Code First para definir un modelo de datos de Entity Framework, debe invalidar CreateDataSource para proporcionar explícitamente la ObjectContext subyacente para el tiempo de ejecución de los servicios de datos. Para obtener más información, vea Usar Code First de Entity Framework 4.1 con los servicios de datos de WCF. Para los servicios de datos basados en modelo de datos de Code First, se efectúa una operación de reintento similar en el método que invalida el método CreateDataSource. A continuación, se muestra la invalidación del método para un modelo de datos de Code First basado en Northwind:
// You must override CreateDataSource to manually return an ObjectContext,
// otherwise the runtime tries to use the built-in reflection provider instead of
// the Entity Framework provider.
protected override ObjectContext CreateDataSource()
{
// Create a new Code First Northwind DbContext.
NorthwindContext nw = new NorthwindContext();
nw.Configuration.ProxyCreationEnabled = false;
// Define a retry policy for our query to the SQL database.
int MaxRetries = 10;
int DelayMS = 100;
RetryPolicy policy =
new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(
MaxRetries, TimeSpan.FromMilliseconds(DelayMS));
// Invoke the query in an inline delegate using the lambda operator.
policy.ExecuteAction(() =>
{
try
{
// Try to open the connection.
nw.Database.Connection.Open();
var storeConnection = (SqlConnection)(nw.Database.Connection);
// Send a quick query to the SQL database to test the connection.
new SqlCommand("declare @i int", storeConnection).ExecuteNonQuery();
}
catch (Exception ex)
{
// If we fail, close the connection.
nw.Database.Connection.Close();
throw ex;
}
});
// Configure DbContext before we provide it to the
// data services runtime.
nw.Configuration.ValidateOnSaveEnabled = false;
// Get the underlying ObjectContext for the DbContext.
var context = ((IObjectContextAdapter)nw).ObjectContext;
// Return the underlying context.
return context;
}
Tal como sucede con el ejemplo anterior, este código utiliza la clase RetryPolicy en el Bloqueo de aplicación para la administración de errores transitorios.
Aprovechar el almacenamiento de blobs
Los servicios de OData pueden exponer los datos de objetos binarios grandes (BLOB). Open Data Protocol (OData) define un mecanismo para recuperar datos binarios independientemente de la entidad a la que pertenezcan. Para ello, hay que separar los datos binarios de la entidad en un flujo de datos independiente. Con los servicios de datos de WCF, se define una secuencia binaria de recursos mediante la implementación de la interfaz IDataServiceStreamProvider al objeto de definir un proveedor de transmisión de datos en secuencias. La implementación del proveedor de transmisión en secuencias proporciona el servicio de datos con la secuencia asociada y con a una entidad específica como un objeto Stream o como un URI que se utiliza para tener acceso a los datos binarios. Para obtener más información, vea Streaming Provider (WCF Data Services).
Al crear un proveedor de servicio de transmisión de datos en secuencias para un servicio de datos hospedado en Windows Azure, utilice el servicio Blob de Windows Azure cuando implemente GetWriteStream y GetReadStream. Para obtener el mejor rendimiento, la implementación de GetReadStreamUri debe devolver el URI del blob de modo que los clientes puedan solicitarlo directamente del servicio Blob.
Proteger un servicio de OData
Hay varias situaciones donde tiene sentido publicar un servicio de OData basado en Windows Azure que permita un acceso anónimo. Sin embargo, en muchos casos debe determinar quién va a tener acceso al servicio de datos. En términos de seguridad, este “quién” se conoce como entidad de seguridad. Asimismo, es preciso determinar si una entidad de seguridad determinada podrá tener acceso a los recursos y (potencialmente) filtrar los resultados de las consultas basadas en la entidad de seguridad que efectúa la solicitud. También puede necesitar proteger los datos devueltos por el servicio de datos para evitar la divulgación a terceros. Para obtener información general sobre la protección de los servicios de datos de WCF, vea Securing WCF Data Services.
- Autenticación
- Los servicios de datos de WCF no autentican las solicitudes de cliente. En su lugar, se apoya en la plataforma de host para que lleve a cabo los procesos de autenticación y para proporcionarle información sobre la entidad de seguridad que realiza la solicitud. Al implementar la autenticación para un servicio de datos hospedado en Windows Azure, utilice la autenticación OAuth 2.0. En la plataforma de Windows Azure, la compatibilidad para este esquema de autenticación lo proporciona Access Control Service (ACS). Para obtener un ejemplo sobre cómo utilizar ACS para implementar la autenticación de OAuth 2.0 para el servicio de datos, vea el artículo OData y OAuth: proteger un servicio OData con OAuth 2.0. Para obtener un ejemplo sobre cómo conectarse a un servicio de OData mediante OAuth 2.0, vea el artículo Conectarse a un servicio de OData protegido con OAuth 2.0.
- Autorización
- Se recomienda definir las reglas que restringen el acceso a los recursos del modelo de datos según el conjunto mínimo de privilegios necesarios para admitir aplicaciones cliente. Para obtener más información, vea Configuring the Data Service (WCF Data Services). Una vez que se ha autenticado a un cliente, la información, como los nombres de usuario, se puede obtener desde la identidad de la entidad de seguridad. En función del modelo de datos, esta información específica de los clientes se puede utilizar para filtrar los datos antes de que se devuelva al cliente a través del servicio de datos. Para hacer esto, hay que definir los interceptores de consultas para los conjuntos de entidades específicas que deben filtrarse. Para obtener más información, vea Interceptors (WCF Data Services). Si se definen los interceptores de consultas que solamente devuelven los datos que pertenecen a una entidad de seguridad o a un rol específicos, los servicios de datos de WCF podrán admitir aplicaciones para varios inquilinos. En el modelo de sistema para varios inquilinos, un único servicio de datos puede mantener muchos clientes a la vez que conserva sus datos de forma independiente. Para obtener instrucciones sobre la creación de aplicaciones para varios inquilinos basadas en Windows Azure, vea Diseñar aplicaciones para varios inquilinos en Windows Azure. También puede definir los interceptores de modificación para transmitir lógica empresarial cuando se envíe un cambio al servicio de datos. Esta lógica también puede comprobar la entidad de seguridad de la solicitud autenticada y, potencialmente, revertir los cambios que hubiera efectuado un usuario no autorizado para hacerlos.
Volver a publicar el servicio Tabla, no recomendado
La clase TableServiceContext, que se utiliza para tener acceso al servicio de Windows Azure, se basa en el cliente de servicios de datos de WCF. Es posible volver a publicar fuentes de OData del servicio Tabla mediante el proveedor de reflejos con TableServiceContext. Sin embargo, la biblioteca cliente de los servicios de datos de WCF no admite el conjunto completo de consultas de Language Integrated Query (LINQ) que utiliza un servicio de OData. Por ello, no se recomienda volver a publicar el servicio de Tabla mediante los servicios de datos de WCF.
Instrucciones para mejorar las aplicaciones del servicio de datos de WCF
Esta sección contiene otro tipo de instrucciones para los servicios de datos de WCF hospedados en Windows Azure. Estas instrucciones se pueden utilizar para proporcionar una experiencia mejorada para aquellos clientes que tengan acceso a un servicio de OData.
- Definir los límites de página para conjuntos grandes de entidades
- Cuando utilice servicios de datos de WCF para exponer conjuntos grandes de datos, debe establecer límites de página para restringir el número de entidades devueltas para los clientes en una única consulta. Si no se establecen límites de página, muy pocos clientes podría usar con facilidad el exceso de recursos mediante la emisión de solicitudes sencillas en las fuentes que contienen muchas entidades. Los límites de página son útiles para distribuir consultas grandes en varias consultas parciales menores, lo que reduce el efecto de las consultas grandes en los tiempos de respuesta globales del sistema. Para establecer límites de página, llame al método SetEntitySetPageSize en cada conjunto de entidades que exponga el servicio de datos. Para obtener más información, vea How to: Enable Paging of Data Service Results (WCF Data Services).
- Habilitar la opción del sistema de consultas $format en los servicios de datos de WCF
- Los servicios de datos de WCF admiten Atom XML y JSON, tal como requiere OData. Cuando los servicios de datos de WCF reciben una solicitud, comprueban el encabezado de solicitud Accept para determinar el formato de la respuesta. OData también proporciona una opción de consulta $format que pueden usar los clientes que no pueden establecer los encabezados de solicitudes, como algunos clientes de JavaScript y el explorador. De forma predeterminada, los servicios de datos de WCF omiten esta opción de consulta del sistema. Para obtener más información, vea WCF Data Services Protocol Implementation Details. Si se habilita la compatibilidad para la opción de consulta $format, también se habilita la compatibilidad para Notación de objeciones de JavaScript con Padding (JSONP) en el código de la página web de JavaScript del lado del cliente cuando se llama a un servicio de OData. Puede agregar esta funcionalidad al servicio de datos si descarga el proyecto de ejemplo JSONP y la compatibilidad con el formato controlado de direcciones URL para los servicios de datos de WCF del sitio web de la Galería de código de MSDN y lo agrega al proyecto del servicio de datos.
Instrucciones para clientes de OData
Esta sección describe el nivel de compatibilidad de cliente para tener acceso a los servicios de OData y a las instrucciones para los clientes que tienen acceso a un servicio de OData.
- Compatibilidad de clientes para tener acceso a los servicios de OData
-
Puesto que OData se basa en protocolos estándar de Internet, cualquier cliente que pueda enviar y recibir mensajes HTTP y que pueda componer y analizar XML o JSON puede tener acceso a un servicio de OData. Para reducir la carga de trabajo necesaria para tener acceso a un servicio de OData, hay varias bibliotecas cliente y aplicaciones cliente que se pueden usar para utilizar los servicios de OData, incluido lo siguiente:
- WCF Data Services Client Library
Para tener acceso a un servicio de OData desde una aplicación .NET Framework. - OData client for Windows Phone
Para tener acceso a un servicio de OData desde una aplicación de Windows Phone. - WCF Data Services Client Library for Silverlight
Para tener acceso a un servicio de OData desde una aplicación de Silverlight. - Cliente de OData para Objective-C
Para tener acceso a un servicio de OData desde dispositivos con iOS (iPhone e iPad) y MacOS. - Biblioteca AJAX de Microsoft para OData
Para tener acceso a un servicio de OData desde una aplicación basada en JavaScript. - PowerPivot para Excel 2010
Se utiliza para importar fuentes de OData en Excel. - Explorador de servicios de Marketplace
Se utiliza para ver datos de suscripciones a Marketplace.
- WCF Data Services Client Library
- Consideraciones respecto al cliente móvil
-
Las consideraciones siguientes se aplican cuando se obtiene acceso a las fuentes de OData desde una aplicación de dispositivo móvil:
-
Habilite siempre la paginación del cliente de forma que el cliente tenga control sobre qué cantidad de datos se envían a través del servicio. Esto se lleva a cabo con las opciones de consulta $skip y $top en el URI de la solicitud.
-
Se debe estar preparado en todo momento para administrar una respuesta paginada desde el servidor. En los servicios de datos de WCF, se solicita la página siguiente con la opción de consulta $skiptoken en una URI de consulta. Para obtener más información, vea How to: Load Paged Results (WCF Data Services).
-
Si solo necesita un recuento del número de elementos de la fuente, solicite solamente el valor de recuento y no toda la fuente. Este recuento se puede realizar solicitando el extremo de $count o incluyendo
$inlinecount=allpagesen el URI de la solicitud. Para obtener más información, vea How to: Determine the Number of Entities Returned by a Query (WCF Data Services). -
Considere utilizar el formato de JSON en lugar de XML de Atom para reducir ancho de banda de red.
Nota Los clientes de los servicios de datos de WCF, incluido el OData client for Windows Phone, no admiten actualmente el formato de JSON. -
Considere la posibilidad de utilizar la compresión para reducir ancho de banda de red. La compresión requiere un procesamiento adicional por parte del servicio de datos y del dispositivo cliente. Este procesamiento adicional puede afectar negativamente a la autonomía de la batería del dispositivo.
-
Considere estrategias, como proyecciones de cliente que utilizan la opción de consulta $select para reducir la cantidad de datos que se envían al cliente. Para obtener más información, vea Query Projections (WCF Data Services).
-
Almacene en caché los datos de referencia en el cliente o implemente otra estrategia de sincronización para reducir la cantidad de datos superpuestos que se hubieran descargado del servicio de datos. Para obtener más información, vea Sincronización de datos entre Windows Azure y clientes móviles.
-
Habilite siempre la paginación del cliente de forma que el cliente tenga control sobre qué cantidad de datos se envían a través del servicio. Esto se lleva a cabo con las opciones de consulta $skip y $top en el URI de la solicitud.
Para obtener instrucciones específicas para la plataforma Windows Phone, vea Usar Windows Phone con Windows Azure.
Fecha de compilación: