Timer jobs para SharePoint OnLine


Muy buenas a todos,

El modelo de desarrollo de SharePoint OnLine, como ya es conocido, no nos permite el uso de soluciones de granja en nuestros desarrollos, basado fundamentalmente en el modelo de objetos de servidor. Por contra, nos propone un modelo basado en los mejorados modelos de cliente.

A priori, puede parecer que le modelo de objetos de cliente tiene ciertas limitaciones por medio de las cuales no podremos cubrir requisitos que impliquen por ejemplo desarrollar TimerJobs. ¿Es esto cierto?, la realidad es que con el modelo de objetos de cliente, no vamos a poder crear TimerJobs tal y como estábamos acostumbrados con las soluciones de granja, ¿significa esto que no podremos crear tareas programadas en SharePoint OnLine?, aquí la respuesta es obviamente no.

Para poder hacerlo tendremos, eso si, que combinar alguno de los servicios que pone a nuestra disposición Microsoft, a través de Azure. Usaremos los WebJobs de Azure para, en combinación con el modelo de clientes, crear una tarea programada para SharePoint OnLine.

En la entrada de hoy vamos a ver un ejemplo de un WebJob de Azure que realiza un tarea en background sobre SharePoint OnLine, crearemos un TimerJob para SharePoint OnLine. Para llevarlo a cabo he seguido estos dos tutoriales que os recomiendo por si quereis echar un vistazo.

https://msdn.microsoft.com/en-us/library/office/dn986826.aspx

https://azure.microsoft.com/es-es/documentation/articles/websites-dotnet-deploy-webjobs/

Creando el proyecto en Visual Studio 2013

Voy a desarrollar un WebJob que escribe en una lista de SharePoint OnLine un registro cada cierto tiempo. Para ello vamos a crear en Visual Studio una aplicación de consola.

Una vez que hemos creado la aplicación de consola, vamos a añadir por medio de Nuget los siguientes paquetes:

  • App for SharePoint ToolKit (for SharePoint OnLine)
  • Microsoft.SharePoint.2013.Client.16

Esto nos añadirá todos los elementos necesarios para autenticarnos y acceder a SharePoint OnLine desde nuestra Aplicación de consola.

A continuación os comparto el código del WebJob que he desarrollado.

namespace AzureWebJobExample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ClientContext context = new ClientContext("https://<sharepointsiteurl>"))
            {
                // Use default authentication mode.
                context.AuthenticationMode = ClientAuthenticationMode.Default;
                context.Credentials = new SharePointOnlineCredentials(GetSPOAccountName(), GetSPOSecureStringPassword());

                try
                {
                    var list = context.Web.Lists.GetByTitle("Noticias");
                    context.Load(list);
                    context.ExecuteQuery();

                    var itemCreateInfo = new ListItemCreationInformation();
                    var listItem = list.AddItem(itemCreateInfo);
                    listItem["Title"] = "News Web Job Example Added " + DateTime.Now;
                    listItem["nwhz"] = "This is an example of a item added from a time job";
                    listItem.Update();
                    context.ExecuteQuery();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("ERROR: " + ex.Message);
                    Console.WriteLine("ERROR: " + ex.Source);
                    Console.WriteLine("ERROR: " + ex.StackTrace);
                    Console.WriteLine("ERROR: " + ex.InnerException);
                }
            }
        }
        private static SecureString GetSPOSecureStringPassword()
        {
            try
            {
                Console.WriteLine("Entered GetSPOSecureStringPassword.");
                var secureString = new SecureString();
                foreach (char c in ConfigurationManager.AppSettings["SPOPassword"])
                {
                    secureString.AppendChar(c);
                }
                Console.WriteLine("Constructed the secure password.");

                return secureString;
            }
            catch
            {
                throw;
            }
        }

        private static string GetSPOAccountName()
        {
            try
            {
                Console.WriteLine("Entered GetSPOAccountName.");
                return ConfigurationManager.AppSettings["SPOAccount"];
            }
            catch
            {
                throw;
            }
        }

    }
}

Como podéis ver el código es muy sencillo, tan solo hay que añadir dos funciones, tal y como nos cuentan en uno de los enlaces que os he indicado, para obtener del app.config el usuario y la contraseña para conectarnos a SharePoint OnLine. Tras esto, usando el modelo de objetos de cliente para C# se hacen las operaciones deseadas sobre SharePoint OnLine.

Lo que nos queda ahora, es publicar el WebJob en Azure para que funcione correctamente, que será lo que veremos en la próxima sección

Publicando el WebJob en Azure

Vamos a ver ahora los pasos para publicar nuestro WebJob en Azure y ver como funciona.

1.- Seleccionamos la opción de publicar la aplicación de consola como Azure WebJob

webjob1

2.- El siguiente es configurar el WebJob

webjob2

Es importante tener en cuenta una cosa. Este WebJob se crea en el modo gratuito (o yo no he encontrado la forma de crearlo desde visual studio en otro modo), y este modo tiene una limitación a la hora de la frecuencia permitida de como máximo una hora, por lo que si seleccionamos una frecuencia mayor, nos dará un error. Luego podremos modificar la frecuencia desde el portal de Azure si queremos hacerlo más frecuente, pero para empezar, debemos de tener en cuenta esa restricción.

3.- A continuación configuramos el website al que estará asociado el webjob

webjob3

webjob4

webjob5

webjob6

4.- Cambiando la configuración del WebJob en el portal de Azure

webjob7

En nuestro portal de Azure, en el Área de “Programador”, accedemos a la colección de trabajos que se ha creado por defecto y en “Escalar”, cambiamos del modo gratis a estándar y cambiamos el límite de frecuencia de ejecución. Tras esto entramos a trabajos y configuramos el que tenemos creado para que se ejecute a cada minuto (para poder ver como funciona el WebJob que hemos creado más rápidamente). No debemos olvidar guardar los cambios para que surtan efecto.

5.- Viendo los resultados del webjob.

webjob9

webjob10

Tanto en el sitio de SharePoint, como dentro de nuestro website de Azure se pueden ver los resultados de la ejecución del WebJob. Aquí se puede ver el resultado del TimerJob para SharePoint OnLine que hemos creado ;).

Y nada más por hoy, espero que como siempre os sea útil, evidentemente el ejemplo es muy sencillo, y podemos ir mucho más allá con esta técnica, pero simplemente os quería mostrar cómo hacerlo.

Un saludo a todos

Anuncios

2 comentarios en “Timer jobs para SharePoint OnLine

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s