Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Les Azure Functions constituent un moyen simple d’héberger vos webhooks SharePoint : vous pouvez ajouter le code C# ou Javascript de votre webhook via le navigateur et Azure s’occupe de l’hébergement et de la mise à l’échelle de votre fonction.
Ce guide montre comment configurer et utiliser des Azure Functions pour vos webhooks à l’aide de la Portail Azure. Vous pouvez également vous reporter à l’article Créer des webhooks Azure Functions pour SharePoint à l’aide d’un modèle azd pour automatiser l’ensemble du processus à l’aide d’un modèle azd.
Créer une application de fonctions Azure
La première étape consiste à créer une application de fonctions Azure, à savoir une application web Azure spéciale destiné à l’hébergement de Azure Functions.
Accédez à https://portal.azure.com, recherchez application de fonction. Sélectionnez Application de fonction dans les résultats de la recherche.
Cliquez sur l’option Ajouter.
Complétez les informations nécessaires à la création de l’application de fonctions, puis cliquez sur Vérifier + créer.
Cliquez sur Créer.
Une fois le déploiement terminé, cliquez sur Accéder à la ressource.
Créer une fonction Azure
Maintenant que l’application destinée à héberger les fonctions est prête, vous pouvez continuer en cliquant sur le lien Nouvelle fonction.
Le site vous propose de créer votre fonction à partir d’un modèle. Pour les webhooks SharePoint, nous avons besoin d’une fonction déclenchée par HTTP et, puisque nous écrivons du code C# dans notre exemple, cela signifie que nous utilisons le modèle de fonction HttpTrigger-CSharp.
Sélectionnez l’option d’environnement de développement dans le portail, puis cliquez sur Continuer.
Sélectionnez type de déclencheur Webhook + API, puis cliquez sur Créer.
Le résultat est une fonction Azure « par défaut » écrite en C#.
Dans notre cas, nous souhaitons que cette fonction Azure se comporte comme un service de webhook SharePoint ; nous devons donc implémenter les tâches suivantes en C# :
- Renvoi de la valeur validationtoken si spécifié à l’appel en tant que paramètre d’URL. Cette condition est expliquée dans Création d’un abonnement, et SharePoint attend une réponse en moins de 5 secondes.
- Traitement de la notification de webhook JSON. Dans l’exemple suivant, nous avons choisi de stocker la notification JSON dans la file d’attente de stockage afin qu’une tâche web Azure puisse la détecter et la traiter de manière asynchrone.
- Selon vos besoins, vous pouvez également traiter la notification directement dans votre service webhook, mais n’oubliez pas que tous les appels de service webhook doivent recevoir une réponse en moins de 5 secondes, raison pour laquelle un modèle asynchrone est recommandé.
Pour réaliser ces tâches, vous pouvez remplacer le code par défaut par le code suivant :
#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; }
}
Configurer votre fonction Azure
Étant donné que nous avons choisi le bon modèle initial, la configuration est presque terminée. La seule chose qu'il vous reste à faire est de configurer Stockage File d'attente Azure en tant que liaison de sortie afin que nous puissions ajouter des messages à la file d'attente à mesure qu'ils arrivent.
Sélectionnez Intégrer, puis Nouvelle sortie pour ajouter la liaison de sortie.
Sélectionnez Stockage File d’attente Azure comme type de liaison, puis cliquez sur Sélectionner.
Cliquez sur Save (Enregistrer).
Tester votre fonction Azure (test de jeton de validation)
Tout est maintenant prêt pour tester votre première fonction Azure.
Revenez à l’écran de code en cliquant sur le nom de la fonction HttpTrigger1 dans le panneau de navigation. Cliquez ensuite sur l’onglet Test pour ouvrir le panneau de test à droite.
Ajoutez un paramètre d’URL validationtoken avec une chaîne aléatoire comme valeur.
Cette configuration imite le comportement de SharePoint en appelant votre service de webhooks lors de la validation de l’ajout d’un webhook.
Cliquez sur Exécuter pour tester...
Si tout se passe bien, la section des journaux indiquera que votre service a été appelé et qu’il a renvoyé la valeur transmise avec une réponse HTTP 200.
Tester votre fonction Azure (test d’événement de liste SharePoint)
Pour le deuxième test. Cela testera votre fonction comme si elle avait été appelée par un événement de liste SharePoint.
- Dans le panneau test, effacez le paramètre d’URL validationtoken et remplacez le corps de la demande par l’objet JSON suivant. Cliquez ensuite sur Exécuter.
{
"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 tout va bien, vous devez voir tous les messages du journal, y compris celui qui indique que le message a été ajouté à la file d’attente.
Récupérer l’URL de webhook à utiliser dans votre implémentation
Nous devons indiquer à SharePoint l’URL de webhook que nous utilisons. Pour cela, nous allons d’abord copier l’URL de la fonction Azure.
Cliquez sur Obtenir l’URL de la fonction.
Cliquez sur Copier pour copier l’URL de l’application de fonction Azure dans votre Presse-papiers.
Dans notre cas, l’URL de webhook à utiliser est la suivante :
https://fa-acto-spwebhook-dev-westus.azurewebsites.net/api/HttpTrigger1?code=LTFbMHrbVVQkhbL2xUplGRmY5XnAI9q/E4s5jvfeIh00KsF9Y7QsJw==