El propósito de un WebJobs SDK es simplificar el código que escriba para tareas comunes que una WebJob puede llevar a cabo, tales como el procesamiento de imágenes, procesamiento de la cola, la agregación de RSS, mantenimiento de archivos, y el envío de correos electrónicos.

En nuestro caso, vamos a realizar una aplicación que automatizará la lectura de datos desde un servicio de noticias RSS, pudiendo elegir el numero de noticias que queremos mostrar.

Se pueden crear dos tipos de Web Job, de ejecución continua o programados

Lo que aprenderá

  • Habilitar el equipo para el desarrollo de Azure mediante la instalación del SDK de Azure.
  • Crear un proyecto de aplicación de consola que se despliega automáticamente como un WebJob Azure cuando se implementa el proyecto web asociado.
  • Publicar una aplicación con un backend WebJobs a una aplicación web en la aplicación de servicio.
  • Publicar un WebJobs en Azure programable

Empezamos

Lo primero que vamos  a necesitar va a ser una tabla dentro de un BBDD dentro de nuestro servidor de Azure SQL Server, ya que en algún sitio tenemos que almacenar la información que recuperamos de la RSS.

CREATE TABLE [dbo].[TITULARES](

[IDTITULAR] [int] NOT NULL PRIMARY KEY,

[TITULO] [nvarchar](max) NULL,

[ENLACE] [nvarchar](max) NULL,

[DESCRIPCION] [nvarchar](max) NULL,

[FECHA] [date] NULL)

Después vamos a proceder a crear nuestro Web Jobs

Nos crearemos una Aplicacion de consola (Console Application) llamado ServicioNoticiasWebJob

y  dentro crearemos una carpeta para meter nuestros modelos que consumirán el servicio, primero añadiremos nuestro Entity Framework llamado EntidadNoticias y luego una clase llamada Noticia, esta contendrá solo los campos que nos interesen almacenar, por ejemplo voy a poner el titular, el enlace donde esta alojada la noticia y la descripción.

CLASE NOTICIA.CS

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace ServicioNoticiasWebJob.Modelos

{

public class Noticia

{

public String Titular { get; set; }

public String Enlace { get; set; }

public String Descripcion { get; set; }

}

}

Ahora creamos una carpeta llamada Helpers y contendra dos clases

ServicioNoticias.cs que leera el servicio RSS y Noticia.cs que nos permitirá modelar las noticias en nuestra BBDD

public class ServicioNoticias
{

//METODO QUE LEERA DE UNA FUENTE RSS Y CREARA UNA COILECCION DE NOTICIAS CON DICHO FUENTE UTILIZANDO LINQ TO XML
public List<Noticia> GetNoticias()
{

String url = “http://www.20minutos.es/rss/”;
//EL OBJETO QUE LEERA LINQ A PARTIR DE UNA DIRECCION WEB
XDocument docxml = XDocument.Load(url);
XNamespace ns = “http://purl.org/rss/1.0/”;
var consulta = from datos in docxml.Descendants(ns +”item”)
select new Noticia

{
Titular = datos.Element(ns+”title”).Value,
Vinculo = datos.Element(ns+”link”).Value,
Descripcion = datos.Element(ns+”description”).Value
};

return consulta.ToList();
}

}

}

public class Noticia
{

EntidadNoticias entidad;

public ModeloNoticias()
{
this.entidad = new EntidadNoticias();
}
//METODO PARA RECUPERAR EL ID MAXIMO DE UNA NOTICIA
public int GetIdMaximoTitular()
{
var consulta = (from datos in entidad.TITULARES
select datos.IDTITULAR);
if (consulta.Count() == 0)
{
return 1;
}else
{
return consulta.Max() + 1;
}
}
public void RellenarNoticias(List<Noticia> noticias)
{
int idtitular = this.GetIdMaximoTitular();
foreach(var noti in noticias)
{

TITULARES t = new TITULARES();
t.IDTITULAR = idtitular;
t.TITULO = noti.Titular;
t.ENLACE = noti.Vinculo;
t.DESCRIPCION = noti.Descripcion;
t.FECHA = DateTime.Now;
this.entidad.TITULARES.Add(t);
idtitular++;

}
this.entidad.SaveChanges();

}

Ya solo nos queda hacer las llamadas desde el arranque de nuestra WebJob

Vamos a la clase Program.cs y en el Main las realizamos:

class Program

{

static void Main(string[] args)

{

var servicio = new ServicioNoticias();

List<Noticia> noticias = servicio.GetNoticiasDia();

var modelobbdd = new ModeloNoticias();

modelobbdd.ActualizarBBDDNoticias(noticias);

}

}

Ya tenemos las noticias en nuestra BBDD

Crear una aplicación MVC

Para darle forma y verlo de una manera mas visual, nos vamos a crear una aplicación MVC para consumir las noticias de la BBDD. La llamaremos MVCNoticiasWebJobs y aprovechamos al crearla y marcamos host en Azure(App Service) para luego simplificar su publicación (para ver publicación en Azure, ver el post sobre ello).

Establecemos este Proyecto como principal dentro de nuestra solución y en la carpeta Models vamos a agregar nuevamente un EF con la tabla TITULARES y una clase llamada Noticias.cs, en la que realizaremos una consulta para recuperar las noticias, como queríamos poder elegir la cantidad de noticias le pasaremos por parámetros las noticias que queremos mostrar y gracias a Take nos “paginara” las noticias.

public class Noticias
{
EntidadNoticias entidad;
public Noticias()
{
this.entidad = new EntidadNoticias();
}

public List<TITULARES> GetNoticias(int numero)
{

var consulta = (from datos in entidad.TITULARES
orderby datos.IDTITULAR
descending
select datos).Take(numero);
return consulta.ToList();

}

}

Como en todo MVC, acabado la parte de modelaje, vamos con los Controladores y las vistas,

NoticiasController.cs

public class NoticiasController : Controller
{

Noticias modelo;
public NoticiasController()
{
this.modelo = new Noticias();
}
// GET: Noticias
public ActionResult Index()
{
List<TITULARES> lista = modelo.GetNoticias(10);
return View(lista);
}
// POST: Noticias
[HttpPost]
public ActionResult Index(int numero)
{
List<TITULARES> lista = modelo.GetNoticias(numero);
return View(lista);
}

}

Index.cshtml

@{
ViewBag.Title = “Index”;
}
@model List<MVCNoticiasWebJobs.Models.TITULARES>
<h2>Servicio de Noticias 20 minutos</h2>

<form method=”post”>
<div>
<label>Número de noticias a mostrar: </label>
<input type=”text” name=”numero” class=”form-control” placeholder=”Número de noticias” />
<button type=”submit” class=”btn-success”>Mostrar Noticias</button>
</div>
</form>
<hr />
@foreach (var n in Model)
{
<div style=”background-color:azure”>
<p>@n.TITULO</p>
<p><a href=”@n.ENLACE”>Ver noticia</a></p>
<p>@Html.Raw(n.DESCRIPCION)</p>

</div>
}

Y hasta aquí un MVC normal, ahora bien tenemos que asociar los dos proyectos para automatizar el Web Job

Inmediatamente a continuación vemos el cuadro de la siguiente foto y al estar dentro del mismo proyecto debería aparecernos prácticamente todo relleno solo, le damos a aceptar y nos instalara el paquete NuGet de WebJobs y ya podemos publicar el proyecto MVC en Azure.

Sobre el proyecto MVCNoticiasWebJobs botón derecho Publish y tras verificar que los campos están bien otra vez Publish.

Automatizar las Peticiones del WebJob

Para programar una tarea automática del Web Job, debemos crear un archivo ZIP con el ejecutable, por lo que nos vamos a nuestra carpeta del proyecto y a Debug de la aplicación de consola; sobre el proyecto WebJobNoticias le damos al botón derecho y abajo del todo nos aparece Open Folder in File Explorer, hacemos click y nos llevara automáticamente a la carpeta del proyecto o bien la buscamos con el Explorador de Windows, una vez en la raíz del proyecto:

C:\Users\Sertxito\OneDrive – Tajamar\MCSD\Clase\Azure_WebServices\WebJobNoticias\WebJobNoticias\bin  botón derecho sobre Debug, que es donde se encuentra nuestro .exe y lo convertimos a ZIP (y solo ZIP!!! No reconoce otro formato).

 

Ahora vamos a la plataforma Azure y dentro de nuestros recursos buscamos el MVCNoticiasWebJobs y dentro de Trabajos Web, lo primero vemos el otro servicio publicado y encima un boton de agregar,  le presionamos

Se nos habilita el panel de creación

Muy importante es proporcionarle una expresión CRON válida, si pinchamos en el cuadro gris de arriba nos envía a la pagina de microsoft que nos explica como crearla

Y ya tenemos nuestra aplicación funcionando, tirando de un WebJobs automatizado y en la nube, espero que os sirva de ayuda, un placer y hasta otra ^.^

Dejo el VideoTutorial por si os surge alguna duda.