Partager via


Utilisation des fonctions Azure avec les webhooks SharePoint

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.

  1. Accédez à https://portal.azure.com, recherchez application de fonction. Sélectionnez Application de fonction dans les résultats de la recherche.

    Création d’une application de fonctions Azure

  2. Cliquez sur l’option Ajouter.

    Ajouter une application de fonctions Azure

  3. Complétez les informations nécessaires à la création de l’application de fonctions, puis cliquez sur Vérifier + créer.

    Renseignez les détails de l’application de fonction Azure

  4. Cliquez sur Créer.

    Page de confirmation de l’application de fonction Azure

  5. Une fois le déploiement terminé, cliquez sur Accéder à la ressource.

    Page Terminée de l’application de fonction Azure

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.

Page d’accueil de l’application de fonction Azure

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.

  1. Sélectionnez l’option d’environnement de développement dans le portail, puis cliquez sur Continuer.

    Page Sélectionner l’environnement de développement

  2. Sélectionnez type de déclencheur Webhook + API, puis cliquez sur Créer.

    Page Sélectionner le type de déclencheur

    Le résultat est une fonction Azure « par défaut » écrite en C#.

    Page Environnement de développement affichant le code par défaut 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.

  1. Sélectionnez Intégrer, puis Nouvelle sortie pour ajouter la liaison de sortie.

    Paramètres d’intégration de fonction Azure

  2. Sélectionnez Stockage File d’attente Azure comme type de liaison, puis cliquez sur Sélectionner.

    Sélection de liaison de fonction Azure

  3. Cliquez sur Save (Enregistrer).

    Paramètres de Stockage File d’attente Azure de fonction Azure

Tester votre fonction Azure (test de jeton de validation)

Tout est maintenant prêt pour tester votre première fonction Azure.

  1. 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.

    Accéder au panneau de test de fonction Azure

  2. 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...

Configurer le test validationToken de la fonction Azure

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.

Résultats du test validationToken

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.

  1. 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ésultats des tests de notification webhook

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.

  1. Cliquez sur Obtenir l’URL de la fonction.

    Console de message de journal

  2. Cliquez sur Copier pour copier l’URL de l’application de fonction Azure dans votre Presse-papiers.

    Lien obtenir l’URL de la fonction

Dans notre cas, l’URL de webhook à utiliser est la suivante :

https://fa-acto-spwebhook-dev-westus.azurewebsites.net/api/HttpTrigger1?code=LTFbMHrbVVQkhbL2xUplGRmY5XnAI9q/E4s5jvfeIh00KsF9Y7QsJw==

Voir aussi