Como continuación del post qué escribí hace tiempo en relación a las novedades en manejadores de eventos para SharePoint 2013, en este nuevo artículo quería explicar como quedaría el trabajo con dichos manejadores tanto para SharePoint 2013 RTM como para SharePoint Online en Office 365. Al lío pues:
-
El proceso para crear el manejador de eventos remoto comienza como siempre creando una aplicación para SharePoint 2013 en Visual Studio 2013. La pregunta aquí es: ¿Qué tipo de hosting elijo? Y la respuesta es clara: Autohosted o Provider-Hosted. Si recordáis, en este blog comenté que con algún truco se podían añadir manejadores de eventos remotos en aplicaciones de tipo SharePoint-Hosted, aunque la idea es no tener que usarlos para este tipo de aplicaciones.
-
Una vez creada la aplicación, le agramamos un elemento de tipo “Receptor de eventos remoto” qué por un lado añade a nivel del proyecto de aplicación de SharePoint el SPI (SharePoint Project Item) para el manejador. Este SPI contiene el manifiesto del manejador qué indica el evento o eventos a los qué responde y sobre todo el extremo dónde está el servicio WCF qué reaccionará antre los eventos manejados. Por otro lado, se añade en el proyecto web de la solución un servicio WCF cuya lógica tenemos que programar.
-
Si editamos el código del servicio WCF, necesitaremos en primer lugar los siguientes espacios de nombres adicionales:
using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Channels; using System.Net;
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, «Courier New», courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
-
A continuación, procederemos a codificar los dos métodos del servicio qué nos permiten responder a eventos de naturaleza síncrona (ing) y asíncrona(ed). Para los eventos síncronos, tenemos que codificar el método ProcessEvent siguiendo por ejemplo el primer post de la serie.
-
En cambio, para los eventos asíncronos tendremos que codificar el método ProcessOneWayEvent de acuerdo al siguiente fragmento de código:
HttpRequestMessageProperty requestProperty =
(HttpRequestMessageProperty)OperationContext.Current.IncomingMessageProperties[HttpRequestMessageProperty.Name];
string contextTokenString =
requestProperty.Headers["X-SP-ContextToken"];
// If there is a valid token, continue.
if (contextTokenString != null)
{
SharePointContextToken contextToken =
TokenHelper.ReadAndValidateContextToken(
contextTokenString, requestProperty.Headers[HttpRequestHeader.Host]);
Uri sharepointUrl =
new Uri(properties.ItemEventProperties.WebUrl);
string accessToken =
TokenHelper.GetAccessToken(contextToken, sharepointUrl.Authority).AccessToken;
using (ClientContext ctx =
TokenHelper.GetClientContextWithAccessToken(sharepointUrl.ToString(), accessToken))
{
if (properties.EventType == SPRemoteEventType.ItemAdded)
{
List lList =
ctx.Web.Lists.GetByTitle(
properties.ItemEventProperties.ListTitle);
ctx.Load(lList);
ListItem liItem =
lList.GetItemById(
properties.ItemEventProperties.ListItemId);
ctx.Load(liItem);
ctx.ExecuteQuery();
liItem["Title"] +=
" - Elemento Añadido";
liItem.Update();
ctx.ExecuteQuery();
}
}
}
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, «Courier New», courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
-
Cómo veis, frente al primer artículo de la serie basado en la versión Preview de SharePoint 2013, en este caso hacemos uso de la clase TokenHelper proporcionada al crear el proyecto de aplicación qué nos da las clases y métodos necesarios para poder interactuar de vuelta con SharePoint mediante OAuth dado qué en este caso estamos actualizando información del elemento de lista que se ha añadido. Fijaros en la mecánica a seguir:
-
En primer lugar, al realizar una petición a SharePoint desde una aplicación (en este caso desde el servicio WCF qué implementa la lógica del manejador de eventos remoto), necesitamos disponer de un Token de Contexto qué es generado por ACS (Azure Token Service).
-
Con el Token de contexto disponible, estamos en disposición de poder hacer operaciones “de vuelta” (callback) contra SharePoint para lo que necesitamos disponer de un Token de Acceso. Fijaros en como este Token de Acceso es obtenido por la aplicación partiendo del Token de Contexto y de nuevo a través de ACS.
-
Con el Token de Acceso, ya podemos crear una instancia de ClientContext y empezar a interactuar con SharePoint.
-
-
Dicho esto, ya sólo queda comenzar a probar el manejador de eventos remoto y verificar que funciona de forma correcta.