En el artículo anterior expuse las bondades que nos ofrece este servicio de Azure Web Jobs así como la versatilidad a la hora de poder realizar tareas muy diversas que extiendan la funcionalidad de nuestros sitios consiguiendo que no sean sólo páginas web de contenido sino que alcancen la excelencia de las aplicaciones web pudiendo tratar la información y realizando tareas automatizadas.
En esta ocasión veremos un ejemplo práctico de aplicación de un WebJob para procesar información de un sitio web que muestra datos extraídos de Open Data Canarias, en concreto de las playas de la isla de Tenerife.
Como se puede observar en el enlace de la fuente de datos, podemos obtener la información en CSV, JSON y XML pero, entre todos los campos hay algunos que pueden variar en cortos espacios de tiempo y, además, no disponemos de foto de las mismas, algo que se podría considerar esencial. Por lo tanto, el objetivo del WebJob será el de almacenar los datos obtenidos de la fuente de datos en un Table Storage de Azure y además, le pondrá la URL de una imagen sacada de una búsqueda de Bing en un campo destinado a ello.
Desgranando el WebJob
El WebJob que usaremos será un sencillo proyecto de consola que se conectará a la fuente de los datos para obtener los elementos actuales y, posteriormente hará lo propio a una cuenta de Azure Storage donde se guardarán los mismos junto con la imagen obtenida del servicio de Bing.
{
public static string StorageConnectionString { get; set; }
static void Main(string[] args)
{
StorageConnectionString = «DefaultEndpointsProtocol=https;AccountName=tenerifebeachsstorage;AccountKey=gtGWx+8u2p1SWDHNNDGt+Bx3ar09klj83wPP0VIOQA6FasOawSCnLcTdYg6EkImfjc4EZwBZXCWOqnaTXnOBhw==»; var beachs = GetBeachs();
SaveBeachs(beachs);
} private static List<BeachJson> GetBeachs()
{
var dataService = new BeachService();
var data = dataService.Get();
return data;
}
private static void SaveBeachs(List<BeachJson> beachs)
{
var storageService = new BeachStorageService(StorageConnectionString);
storageService.SaveList(beachs);
}
}
Para abstraer el código que obtiene y guarda los elementos, he creado una clase/servicio en otro proyecto para que pueda ser reutilizable por otros elementos de mi solución o incluso expuesto al exterior por Api REST desde Web Api.
Lo más reseñable de este servicio, es el método para guardar los elementos. Como es posible que haya nuevos elementos o que se eliminen algunos de los existentes, la idea es eliminar los datos de TableStorage (29 registros) y volver a cargarlos con la imagen correspondiente.
public bool SaveList(List<BeachJson> list)
{
try
{
TruncateTable();
foreach (var item in list)
{
var beach = new Beach(item);
beach.Picture = GetPictureUrl(«Tenerife « + item.Title + » « +item.County);
TableOperation insertOperation = TableOperation.Insert(beach);
this.Context.Execute(insertOperation);
}
return true;
}
catch (Exception)
{
return false;
}
}
Asociando el WebJob al sitio web
Como vimos en el artículo anterior, hay varias formas de publicar el WebJob asociado al sitio web. En esta ocasión lo haré desde Visual Studio, asociando el proyecto de consola que ejecuta las tareas de actualización al proyecto MVC 4.5 que se corresponde con el WebSite.
Como se puede ver, el WebJob se ejecutará de forma periódica una vez al día, a las 12.00 AM (00:00), de esta forma, intentaremos minimizar el impacto causado a nuestros visitants, aunque habría que analizar cuándo tenemos menos visitas en nuestro WebSite para establecer la hora adecuada de ejecución.
Publicando el Web Site
Una vez asociado el WebJob, procedemos a publicar el WebSite desde Visual Studio y tras hacerlo, podremos comprobar cómo nos aparece el WebJob publicado en el nodo correspondiente del navegador de Servidor.
Viendo los resultados
Una vez tenemos todo publicado, podemos navegar la WebSite para comprobar si todo ha funcionado correctamente (como así esperamos).
Una vez estamos en la portada, navegando a la opción “Playas” aparecerá un listado con las playas obtenidas desde Table Storage, con la imagen obtenida desde el servicio de Bing, además de mostrarlas en el mapa.
Conclusión
Como hemos podido comprobar, operaciones para extender nuestros sitios web, que en el pasado debíamos hacer con un Cloud Service, con el consiguiente aumento de coste mensual, podemos realizarla ahora dentro del contexto de un Web Site despreocupándonos un poco del coste porque se usa el procesamiento de este mismo.