Azure. WebJobs para ejecutar procesos programados en SharePoint Online

Con SharePoint On-Premises podemos programar trabajos que ejecutan procesos sobre los sitios de la granja. La propia granja ejecuta trabajos programados que mantienen la plataforma, por ejemplo, para el rastreo de los sitios para el servicio de búsqueda, y en On-Premises podemos implementar y desplegar nuestros propios Time Jobs.

¿Qué pasa con SharePoint Online?

Como los Timer Jobs de SharePoint se ejecutan a nivel de granja tienen privilegios elevados para permitir que un tenant pueda desplegar sus propios trabajos. Por este motivo, no están disponibles en SharePoint Online y tenemos que buscar alternativas válidas para poder implementar procesos programados.

Ya que estamos en la nube y a nuestra suscripción de Office 365 le podemos asociar una suscripción de Azure, podemos implementar ciertos servicios para conectarnos a SharePoint Online, y hoy hablaremos de los Trabajos Web o WebJobs que tenemos disponibles en Sitios Web de Azure.

¿Qué es un WebJob?

Es una característica de los WebSite de Azure que nos permiten ejecutar programas o scripts bajo demanda, continuos o con una programación. La idea es subir un script ejecutable que realizar las tareas que necesitamos para luego ejecutarlo bajo demando o atendiendo a una programación.

Un Script ejecutable puede ser del siguiente tipo:

  • .cmd, .bat, .exe (con Windows cmd)
  • .ps1 (con PowerShell)
  • .sh (con bash)
  • .php (con php)
  • .py (con Phyton)
  • .js (con node)

Para nuestro caso, creamos un .exe que use el modelo de objetos de cliente de SharePoint (CSOM) para leer los datos de una lista y generar un fichero de texto con esos datos en un Blob Storage.

Un CMD que descarga elementos de una lista

Simplemente con una aplicación de consola tenemos para crear nuestro trabajo web en Azure.

Creamos el proyecto en Visual Studio y añadimos las referencias a Microsoft.SharePoint.Client.dll y Microsoft.SharePoint.Client.Runtime.dll, junto con la consulta a la lista:


static
void Main(string[] args)

{

DownloadLlamadas();

}

Ese método instancia un contexto de cliente de SharePoint Online, ejecuta una consulta a una lista y pasa los datos a un método que escribe el fichero de texto en un Blob Storage de Azure.


private
static
void DownloadLlamadas()

{


var username = ConfigurationManager.AppSettings[“AccountUsername”];


var pwd = ConfigurationManager.AppSettings[“AccountPassword”];

 


using (var context = GetContentFromSharePointOnline(username, pwd, “https://tenant.sharepoint.com/ “))

{


var list = context.Web.Lists.GetByTitle(“Llamadas”);

 


var query = new
CamlQuery();

query.ViewXml = “<View><Query><Where><Geq><FieldRef Name=’ID’ /><Value Type=’Number’>1</Value></Geq></Where></Query></View>”;

 


var items = list.GetItems(query);

context.Load(items);

context.ExecuteQuery();

 


var listaLlamadas = new
List<LlamadaCSV>();

 


foreach (ListItem item in items)

{


var currentLlamada = new
LlamadaCSV()

{

Title = GetStringFromItem(item[“Title”]),

TipoLlamada = GetStringFromItem(item[“TipoLlamada”]),

Cliente = GetStringFromItem(item[“NombreCliente”]),

Creado = GetStringFromItem(item[“Created”])

};

 

listaLlamadas.Add(currentLlamada);

}

 

WriteListToAzureStorageFile(listaLlamadas);

 

listaLlamadas.ForEach(llamada =>

{


Console.WriteLine(llamada);

});

}

 

}

Para abrir un contexto en SharePoint Online, hacemos uso de la clase Microsoft.SharePoint.Client.SharePointOnlineCredentials que nos permite autenticarnos frente al servicio de Office 365 con un usuario y contraseña.


private
static
ClientContext GetContentFromSharePointOnline(string username, string password, string url)

{


char[] pwdChars = password.ToCharArray();

System.Security.SecureString pwd = new System.Security.SecureString();


for (int i = 0; i < pwdChars.Length; i++)

pwd.AppendChar(pwdChars[i]);

 


var context = new
ClientContext(url);

context.Credentials = new
SharePointOnlineCredentials(username, pwd);

 


return context;

}

Por último, escribimos los elementos de la lista en un fichero de texto en un Blob Storage:


private
static
void WriteListToAzureStorageFile(List<LlamadaCSV> listaLlamadas)

{


var fileText = string.Join(System.Environment.NewLine, listaLlamadas);

 


var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings[“StorageConnectionString”]);


var blobClient = storageAccount.CreateCloudBlobClient();


var container = blobClient.GetContainerReference(“llamadas”);

container.CreateIfNotExists();

 


var blob = container.GetBlockBlobReference(“llamadas” + DateTime.Now.ToString(“yyyyMMdd”) + “.csv”);

 

blob.UploadText(fileText);

}

Nos queda compilar, generar un .ZIP con todos los ensamblados de nuestra aplicación de consola y crear el trabajo en Azure.

Creamos el WebJob en un Sitio Web

En la pestaña de WebJob de un Sitio Web, tenemos la opción de añadir un nuevo trabajo web con la opción de ‘ADD’

Subimos nuestro ZIP y elegimos el modo de ejecución, que puede ser “Continuo”, “Programado” y “Bajo demanda”. En nuestro caso, elegimos “Run on a Schedule” para programar la ejecución del script cada cierto tiempo.

Una vez que se crea el WebJob, podemos ejecutarlo manualmente para comprobar su correcto funcionamiento y acceder a los LOGS para ver que todo está correcto y, en este caso, además de enviar los datos a Azure, los escribimos en la Consola.

Usando el SDK de WebJob

Aunque con lo que ya tenemos implementado es más que suficiente para simular el Timer Job de SharePoint, tened en cuenta que usando el paquete de Nuget del SDK de WebJob, podemos mejorar las capacidades de diagnóstico y logging además de otras funcionalidades como, por ejemplo, conectar con Azure Queue para que el script del trabajo web se ejecute cuando se introduzca un elemento a la cola. Un ejemplo de esto lo tenemos en la documentación de Azure: http://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-get-started/

Aunque podemos dar un paso más y usar OAuth para conectarnos a SharePoint Online con un contexto de Aplicación y no depender de la contraseña del usuario, la idea de este artículo era conocer los WebJob y que podemos usarlos para generar tareas programadas, simulando los Timer Job, que no tenemos disponibles en SharePoint Online.

 

Saludos a todos…

Deja un comentario

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