Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Azure Functions ofrece una manera sencilla de hospedar sus webhooks de SharePoint: puede simplemente agregar su código de JavaScript o C# del webhook mediante el explorador y Azure se encarga de hospedar y escalar su función.
En esta guía se muestra cómo configurar y usar Azure Functions para los webhooks mediante el Azure Portal. Como alternativa, puede consultar el artículo Creación de Azure Functions para webhooks de SharePoint mediante una plantilla azd para automatizar todo el proceso mediante una plantilla azd.
Crear una Function App de Azure
El primer paso que debe realizar es crear una Function App de Azure, que es un tipo especial de aplicación web de Azure que se centra en hospedar Azure Functions.
Vaya a https://portal.azure.com, busque aplicación de funciones. Seleccione Function App en los resultados de la búsqueda.
Haga clic en la opción Agregar.
Complete la información necesaria para crear la aplicación de funciones y, a continuación, haga clic en Revisar y crear.
Haga clic en Crear.
Cuando se complete la implementación, haga clic en Ir al recurso.
Crear una función de Azure
Ahora que la aplicación para hospedar las funciones está lista, puede continuar con la creación de su primera función de Azure haciendo clic en el vínculo Nueva función:
Esto le permite comenzar la función desde una plantilla; en el caso de webhooks de SharePoint, necesitamos una función desencadenada por HTTP y, como escribimos código de C# en nuestro ejemplo, usamos la plantilla de la función HttpTrigger-CSharp.
Seleccione la opción entorno de desarrollo El portal y, a continuación, haga clic en Continuar.
Seleccione tipo de desencadenador webhook + API y, a continuación, haga clic en Crear.
El resultado es una función de Azure “predeterminada” escrita en C#.
En nuestro caso, queremos que esta función de Azure se comporte como un servicio de webhook de SharePoint, por lo que necesitamos implementar lo siguiente en C#:
- Devuelva el elemento validationtoken si se ha especificado como un parámetro de dirección URL en la llamada. Esto es necesario como se describe en Crear una nueva suscripción y SharePoint espera que la respuesta se produzca en cinco segundos.
- Procese la notificación de webhook JSON. En el ejemplo siguiente, hemos optado por almacenar el archivo JSON en una cola de almacenamiento, de manera que un trabajo web de Azure pueda seleccionarlo y procesarlo de manera asincrónica.
- En función de sus necesidades, también puede procesar la notificación directamente en su servicio de webhook, pero tenga en cuenta que todas las llamadas al servicio de webhook necesitan completarse en 5 segundos, por lo que se recomienda usar un modelo asincrónico.
Para ello, reemplace el código predeterminado por el código siguiente:
#r "Newtonsoft.Json"
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
public static async Task<IActionResult> Run(HttpRequest req,
ICollector<string> outputQueueItem, ILogger log)
{
log.LogInformation($"Webhook was triggered!");
// Grab the validationToken URL parameter
string validationToken = req.Query["validationtoken"];
// If a validation token is present, we need to respond within 5 seconds by
// returning the given validation token. This only happens when a new
// webhook is being added
if (validationToken != null)
{
log.LogInformation($"Validation token {validationToken} received");
return (ActionResult)new OkObjectResult(validationToken);
}
log.LogInformation($"SharePoint triggered our webhook...great :-)");
var content = await new StreamReader(req.Body).ReadToEndAsync();
log.LogInformation($"Received following payload: {content}");
var notifications = JsonConvert.DeserializeObject<ResponseModel<NotificationModel>>(content).Value;
log.LogInformation($"Found {notifications.Count} notifications");
if (notifications.Count > 0)
{
log.LogInformation($"Processing notifications...");
foreach(var notification in notifications)
{
// add message to the queue
string message = JsonConvert.SerializeObject(notification);
log.LogInformation($"Before adding a message to the queue. Message content: {message}");
outputQueueItem.Add(message);
log.LogInformation($"Message added :-)");
}
}
// if we get here we assume the request was well received
return (ActionResult)new OkObjectResult($"Added to queue");
}
// supporting classes
public class ResponseModel<T>
{
[JsonProperty(PropertyName = "value")]
public List<T> Value { get; set; }
}
public class NotificationModel
{
[JsonProperty(PropertyName = "subscriptionId")]
public string SubscriptionId { get; set; }
[JsonProperty(PropertyName = "clientState")]
public string ClientState { get; set; }
[JsonProperty(PropertyName = "expirationDateTime")]
public DateTime ExpirationDateTime { get; set; }
[JsonProperty(PropertyName = "resource")]
public string Resource { get; set; }
[JsonProperty(PropertyName = "tenantId")]
public string TenantId { get; set; }
[JsonProperty(PropertyName = "siteUrl")]
public string SiteUrl { get; set; }
[JsonProperty(PropertyName = "webId")]
public string WebId { get; set; }
}
public class SubscriptionModel
{
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Id { get; set; }
[JsonProperty(PropertyName = "clientState", NullValueHandling = NullValueHandling.Ignore)]
public string ClientState { get; set; }
[JsonProperty(PropertyName = "expirationDateTime")]
public DateTime ExpirationDateTime { get; set; }
[JsonProperty(PropertyName = "notificationUrl")]
public string NotificationUrl {get;set;}
[JsonProperty(PropertyName = "resource", NullValueHandling = NullValueHandling.Ignore)]
public string Resource { get; set; }
}
Configurar la función de Azure
Como hemos elegido la plantilla correcta desde el principio, la configuración casi está completada. Lo único que debes hacer es configurar el Azure Queue Storage como un enlace de salida para que podamos agregar mensajes a la cola a medida que entran.
Seleccione Integrar y, a continuación, nueva salida para agregar el enlace de salida.
Seleccione Azure Queue Storage como tipo de enlace y, a continuación, haga clic en Seleccionar.
Haga clic en Guardar.
Prueba de la función de Azure (prueba de token de validación)
Ahora tiene todo configurado para su primera prueba de la función de Azure.
Vuelva a la pantalla de código haciendo clic en el nombre de la función HttpTrigger1 en el panel de navegación. A continuación, haga clic en la pestaña Probar para abrir el panel de pruebas de la derecha.
Agregue un parámetro de dirección URL validationtoken con una cadena aleatoria como valor.
Con esta configuración, estamos imitando el comportamiento de SharePoint al llamar al servicio de webhook al validar una nueva incorporación de webhook.
Haga clic en Ejecutar para probar...
Si todo funciona correctamente, verá en la sección de registros que se ha llamado al servicio y que ha devuelto el valor que se pasó con una respuesta HTTP 200.
Prueba de la función de Azure (prueba de eventos de lista de SharePoint)
Ahora para la segunda prueba. Esto probará la función como si la llamara un evento de lista de SharePoint.
- En el panel Prueba, borre el validationtoken parámetro url y reemplace el cuerpo de la solicitud por el siguiente objeto JSON. A continuación, haga clic en Ejecutar.
{
"value": [{
"subscriptionId":"1111111111-3ef7-4917-ada1-xxxxxxxxxxxxx",
"clientState":null,
"expirationDateTime":"2020-06-14T16:22:51.2160000Z","resource":"xxxxxx-c0ba-4063-a078-xxxxxxxxx","tenantId":"4e2a1952-1ed1-4da3-85a6-xxxxxxxxxx",
"siteUrl":"/sites/webhooktest",
"webId":"xxxxx-3a7c-417b-964e-39f421c55d59"
}]
}
Si todo está bien, debería ver todos los mensajes de registro, incluido el que indica que el mensaje se agregó a la cola.
Captar la dirección URL del webhook para usarla en su implementación
Necesitaremos que SharePoint conozca la dirección URL del webhook que estamos usando. Para ello, vamos a copiar la dirección URL de la función de Azure.
Haga clic en Obtener la dirección URL de la función.
Haga clic en Copiar para copiar la dirección URL de la aplicación de funciones de Azure en el Portapapeles.
En nuestro caso, la dirección URL del webhook que vamos a usar es la siguiente:
https://fa-acto-spwebhook-dev-westus.azurewebsites.net/api/HttpTrigger1?code=LTFbMHrbVVQkhbL2xUplGRmY5XnAI9q/E4s5jvfeIh00KsF9Y7QsJw==