SharePoint 2010 y Azure: Integración con el Windows Azure Data Market (II)!

Siguiendo con la serie de posts sobre como integrar Windows Azure Data Market y SharePoint 2010, en esta ocasión vamos a ver como podemos realizar dicha integración a través de un Business Data Connectivity Model o simplemente un conector de BCS (Business Connectivity Services) que crearemos en Visual Studio 11 Beta (VS 11 Beta) y que luego desplegaremos en nuestro ambiente de SharePoint. Empecemos:

  • Lo primero que tenemos que hacer como siempre es conocer la forma que tenemos de integrar la fuente de datos del Windows Azure Data Market. En mi caso, voy a trabajar con el set de datos 2006 – 2008 Crime in the United States que se puede integrar de forma muy sencilla en nuestras aplicaciones sin más que añadir una referencia al correspondiente servicio que en este caso es: https://api.datamarket.azure.com/data.gov/Crimes/
  • Como siempre, antes de ponernos a  hacer nada podemos jugar con el set de datos directamente desde el Data Market.
  • En VS 11 Beta creamos un proyecto de tipo SharePoint 2010 Project al que añadimos un elemento de tipo Business Data Connectivity Model que pasaremos a parametrizar a continuación. Este modelo tendrá una única entidad, Crime, que nos permitirá acceder a la información de los crímenes que expone el servicio.
image image image
  • En lugar de trabajar con el diseñador del Business Data Connectivity Model, vamos a agregar en primer lugar la lógica necesaria para acceder a los datos del servicio. Para ello, añadimos en primer lugar una referencia al citado servicio en nuestro proyecto. Tendremos que añadir además una referencia a System.Data.Services.Client.
  • A partir de aquí, en el explorador de soluciones vamos a preparar las dos clases que se crean al añadir el elemento de tipo Business Data Connectivity Model al proyecto: Entity1 y Entity1Service. La primera clase modela la entidad tipo que nos permite integrar los datos del servicio en SharePoint a través de una serie de propiedades. La segunda, contiene los métodos que permiten trabajar con entidades de tipo Entity1.
  • En mi caso, he renombrado Entity1 a Crime y le he añadido las siguientes propiedades que luego se mapearán a propiedades del set de datos expuestos por el servicio:
   1: public partial class Crime

   2: {

   3:     //TODO: Implement additional properties here. The property Message is just a sample how a property could look like.

   4:     public int ID { get; set; }

   5:     public string State { get; set; }

   6:     public string City { get; set; }

   7:     public int Year { get; set; }

   8:     public int Population { get; set; }

   9:     public int Burglary { get; set; }

  10:     public int LarcenyTheft { get; set; }

  11:     public int MotorVehicleTheft { get; set; }

  12: }

  • A continuación iremos por la clase Entity1Service que en este caso renombramos a CrimeService. En la misma añadimos referencias a System.Net, System.Data.Services.Clien y al servicio de Windows Azure Data Market.
  • Añadimos a la clase un método que nos permita devolver un proxy al servicio. Como veis, simplemente se trata de devolver dicho proxy y además lidiar con no tener problemas de conexión por SSL usando para ello ServicePointManager y confiando en certificados del Windows Azure Data Market. Este proxy nos permitirá acceder a los datos del servicio.

 

   1: private static datagovCrimesContainer GetProxy()

   2: {

   3:     ServicePointManager.ServerCertificateValidationCallback =

   4:         ((sender, certificate, chain, sslPolicyErrors) => 

   5:             certificate.Subject.Contains("datamarket"));

   6:     Uri serviceUri =

   7:         new Uri("https://api.datamarket.azure.com/Data.ashx/data.gov/Crimes");

   8:     datagovCrimesContainer proxy =

   9:         new datagovCrimesContainer(serviceUri);

  10:     proxy.Credentials =

  11:         new NetworkCredential("Yor Data Market Account",

  12:             "Your Data Market Key");

  13:     return proxy;

  14:  

  15: }

  • Esta clase al menos tiene que implementar dos métodos:
    • Uno de tipo “Specific finder” que devuelva una entidad de tipo Crime en base a un parámetro como por ejemplo puede ser un identificador. En este caso, el método en cuestión se ha renombrado a ReadCrime. Cómo veis, a partir de un identificador y el proxy podemos acceder fácilmente a un registro expuesto por el servicio y devolverlo.
   1: public static Crime ReadCrime(int id)

   2: {

   3:     datagovCrimesContainer proxy = GetProxy();

   4:  

   5:     var results = from stat in proxy.CityCrime

   6:                   where stat.ROWID == id

   7:                   select stat;

   8:  

   9:     Crime currentStat = new Crime();

  10:  

  11:     currentStat.ID = results.Single().ROWID;

  12:     currentStat.City = results.Single().City;

  13:     currentStat.State = results.Single().State;

  14:     currentStat.Year = results.Single().Year;

  15:     currentStat.Population = results.Single().Population;

  16:     currentStat.Burglary = results.Single().Burglary;

  17:     currentStat.LarcenyTheft = results.Single().LarcenyTheft;

  18:     currentStat.MotorVehicleTheft = results.Single().MotorVehicleTheft;

  19:  

  20:     return currentStat;

  21: }

  •  
    • Uno de tipo “finder” que nos devuelva una colección de objetos de tipo Crime. En este caso se ha renombrado el método a ReadCrimes(). Como antes, a partir del proxy es sencillo obtener una colección de objetos CityCrime expuestos por el servicio que luego usaremos para devolver la colección de objetos de tipo Crime.
   1: public static IEnumerable<Crime> ReadCrimes()

   2: {

   3:     List<Crime> queryResults = new List<Crime>();

   4:  

   5:     datagovCrimesContainer proxy = GetProxy();

   6:  

   7:     IEnumerable<CityCrime> crimes = 

   8:         proxy.CityCrime.Where(c => c.State ==

   9:                "Washington" && (c.Year == 2008 || c.Year == 2007));

  10:  

  11:     //Procesando el set de datos devuelto

  12:     foreach (var c in crimes)

  13:     {

  14:         Crime cr = new Crime();

  15:         cr.ID = c.ROWID;

  16:         cr.City = c.City;

  17:         cr.State = c.State;

  18:         cr.Year = c.Year;

  19:         cr.Population = c.Population;

  20:         cr.Burglary = c.Burglary;

  21:         cr.LarcenyTheft = c.LarcenyTheft;

  22:         cr.MotorVehicleTheft = c.MotorVehicleTheft;

  23:  

  24:         queryResults.Add(cr);

  25:     }

  26:  

  27:     return queryResults.ToList();

  28: }

  • A partir de aquí, de vuelta al explorador del modelo de BDC tenemos que configurar adecuadamente la entidad Crime para que se usen estos métodos y tenga los miembros correspondientes de acuerdo a la definición de la clase. Este trabajo lo haremos en el diseñador del modelo y el explorador.
  • En el diseñador configuraremos el nombre de la entidad y de los métodos expuestos. Mientras que en el explorador del modelo configuraremos adecuadamente los parámetros de entrada y de salida de cada uno de estos métodos.
  • Una vez creado el conector, simplemente lo desplegamos y en nuestro sitio de SharePoint creamos la correspondiente lista externa que mostrará los datos expuestos por el servicio.
image image image

 

Y hasta aquí llega este segundo post sobre la integración de SharePoint 2010 y el Windows Azure Data Market.

Publicado por

Juan Carlos González

Juan Carlos es Ingeniero de Telecomunicaciones por la Universidad de Valladolid y Diplomado en Ciencias Empresariales por la Universidad Oberta de Catalunya (UOC). Cuenta con más de 12 años de experiencia en tecnologías y plataformas de Microsoft diversas (SQL Server, Visual Studio, .NET Framework, etc.), aunque su trabajo diario gira en torno a SharePoint & Office 365. Juan Carlos es MVP de Office Servers & Services desde 2015 (anteriormente fue reconocido por Microsoft como MVP de Office 365 y MVP de SharePoint Server desde 2008 hasta 2015), coordinador del grupo de usuarios .NET de Cantabria (Nuberos.Net, www.nuberos.es), co-fundador y coordinador del Grupo de Usuarios de SharePoint de España (SUGES, www.suges.es), así como co-director de la revista gratuita en castellano sobre SharePoint CompartiMOSS (www.compartimoss.com). Hasta la fecha, ha publicado 8 libros sobre SharePoint & Office 365 y varios artículos en castellano y en inglés sobre ambas plataformas.

2 comentarios en “SharePoint 2010 y Azure: Integración con el Windows Azure Data Market (II)!”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *