En este artículo vamos a ver cómo crear un manejador de eventos remoto que reaccione ante los cambios qué tengan lugar en una lista personalizada desplegada como parte de una aplicación del nuevo modelo de aplicaciones de SharePoint 2013.
Creación del manejador de eventos remoto
Para crear un manejador de eventos remoto que responda a eventos que suceden en los elementos de una lista personalizada, seguiremos los siguientes pasos:
En el asistente de configuración especificamos el nombre de la aplicación, la Url que se va a utilizar para cuestiones de depuración y el tipo de aplicación. Como se aprecia en la Imagen 1, en este caso se están indicando una Url de un sitio de Office 365 y "Autohospedado" como tipo de aplicación.
En nuestro caso, elegimos la opción "Eventos de lista" y marcamos como eventos a controlar los siguientes:
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Receivers ListTemplateId="10000">
<Receiver>
<Name>CompartiMOSSRERItemAdding</Name>
<Type>ItemAdding</Type>
<SequenceNumber>10000</SequenceNumber>
<Url>~remoteAppUrl/CompartiMOSSRER.svc</Url>
</Receiver>
<Receiver>
<Name>CompartiMOSSRERItemUpdating</Name>
<Type>ItemUpdating</Type>
<SequenceNumber>10000</SequenceNumber>
<Url>~remoteAppUrl/CompartiMOSSRER.svc</Url>
</Receiver>
<Receiver>
<Name>CompartiMOSSRERItemAdded</Name>
<Type>ItemAdded</Type>
<SequenceNumber>10000</SequenceNumber>
<Url>~remoteAppUrl/CompartiMOSSRER.svc</Url>
</Receiver>
</Receivers>
</Elements>
Programación del manejador
Una vez qué tenemos creados todos los elementos necesarios para evaluar el funcionamiento de los manejadores de eventos remotos, sólo resta codificar los métodos correspondientes en el servicio WCF:
1public SPRemoteEventResult ProcessEvent(SPRemoteEventProperties properties)23{45SPRemoteEventResult result = new SPRemoteEventResult();67switch (properties.EventType)89{1011case SPRemoteEventType.ItemAdding:1213result.ChangedItemProperties.Add(1415"Title",1617properties.ItemEventProperties.AfterProperties["Title"] +=1819" - Añadiendo Elemento");2021break;2223case SPRemoteEventType.ItemUpdating:2425result.ChangedItemProperties.Add(2627"Title",2829properties.ItemEventProperties.AfterProperties["Title"] +=3031" - Actualizando<br />Elemento");3233break;3435default:3637break;3839}4041return result;4243}44
Como se puede apreciar, por una parte el objeto properties (de tipo SPRemoteEventProperties) contiene la información relativa al evento qué ha ocurrido (propiedad EventType). Por otra parte, para cada tipo de evento síncrono simplemente se accede a la columna Title(cuyo valor a cambiado) del elemento de la lista y se actualiza su valor concatenando una cadena de texto. Esto es posible gracias al objeto result que es de tipo SPRemoteEventResult lo que permite acceder a la(s) columna(s) cuyo valor ha(n) cambiado en el elemento y modificarlas a posteriori y antes de que se guarde el elemento en la lista.
1public void ProcessOneWayEvent(SPRemoteEventProperties properties)23{45if (properties.EventType == SPRemoteEventType.ItemAdded)67{89using (ClientContext ctx = new ClientContext(1011properties.ItemEventProperties.WebUrl))1213{1415List lList =1617ctx.Web.Lists.GetByTitle(1819properties.ItemEventProperties.ListTitle);2021ctx.Load(lList);2223ListItem liItem =2425lList.GetItemById(2627properties.ItemEventProperties.ListItemId);2829ctx.Load(liItem);3031ctx.ExecuteQuery();3233liItem["Title"] +=3435" - Elemento Añadido";36373839liItem.Update();4041ctx.ExecuteQuery();4243}4445}4647}48
En este caso como se trata de procesar un evento síncrono, si queremos hacer algún tipo de operación con el elemento de la lista tendremos que acceder al mismo una vez añadido (para el caso de ejemplo). Como el acceso se realiza de forma remota desde un servicio WCF, tenemos que recurrir al modelo de objetos en cliente para poder recuperar el elemento y realizar el procesado requerido. De nuevo, el objeto properties nos da toda la información necesaria (a través de la propiedad ItemEventProperties) para poder crear instancias de objetos ClientContext, List y ListItem. Cada vez que necesitemos información del sitio de SharePoint, es necesario definir la operación a realizar y posteriormente llamar al método ExecuteQuery del objeto ClientContextcreado.
Despliegue y prueba del manejador
El despliegue y prueba del manejador de eventos remotos para una aplicación de tipo "Autohosted" es realmente sencillo:
--Url de la aplicación
https://defe8b3e-8dbf-4afe-9ca2-274728027618.o365apps.net/Pages/Default.aspx?SPHostUrl=https%3A%2F%<DominioOffice365> %2Esharepoint%2Ecom%2Fsites%2FTDEVCR&SPLanguage=es%2DES&SPClientTag=0&SPProductNumber=15%2E0%2E4454%2E1011&SPAppWebUrl=https%3A%2F%2F<DominioOffice365>%2Dfe7f0e9d237f43%2Esharepoint%2Ecom%2Fsites%2FTDEVCR%2FSPRERDemo
--Url del servicio
https://defe8b3e-8dbf-4afe-9ca2-274728027618.o365apps.net/CompartimossRER.svc
https://<URL_Sitio_Office365>/<NombreAplicacion>/Lists/<NombreLista>
Al introducir esta Url en el navegador, automáticamente se realiza una redirección a una Url de la forma:
https://<DominioOffice365>-fe7f0e9d237f43.sharepoint.com/sites/TDEVCR/SPRERDemo/Lists/ListaTestRER/AllItems.aspx
Como
se puede deducir, el proceso de despliegue de la aplicación implica en este
caso la creación de un subsitio en el qué se va a crea la instancia lista en
base a la definición incluida en el proyecto. Adicionalmente, este sitio se
encuentra en un dominio completamente aislado del sitio en el que agrego originalmente
la aplicación.
Nota:
Como se puede apreciar en la Imagen 6, el manejador de eventos remoto está respondiendo de forma correcta a eventos de naturaleza síncrona, pero no a eventos de naturaleza asíncrona. Como en la fecha de realización de este artículo (febrero de 2012) Microsoft se encuentra actualizando el servicio de SharePoint Online en Office 365, este puede ser el motivo de qué el manejador no esté respondiendo de forma correcta a eventos de naturaleza asíncrona. Adicionalmente, la versión de las herramientas de desarrollo para SharePoint y Office de Visual Studio 2012 sigue siendo la Preview 2.
Conclusiones
Los manejadores de eventos remotos vienen a cubrir una capacidad muy demandada por los desarrolladores de SharePoint desde hace años: poder reaccionar a eventos que ocurren en el sistema desde aplicaciones de negocio externas. Estos manejadores se implementan en la forma de servicios WCF que reaccionan ante eventos que se produzcan en los ámbitos de sitio web, lista y elemento de lista. Adicionalmente, las listas externas y los tipos de contenido externos soportan manejadores de eventos aunque su tratamiento se sale del ámbito de este artículo.
Juan Carlos González Martín MVP de SharePoint Server, Arquitecto de soluciones en el CIIN jgonzalez@gruposodercan.es @jcgm1978 http://geeks.ms/blogs/ciin