Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Azure Functions oferece uma maneira fácil de hospedar seus webhooks do SharePoint: você pode adicionar seu webhook ou código JavaScript por meio do navegador e o Azure cuida da hospedagem e do dimensionamento de sua C# função.
Este guia mostra como configurar e utilizar Azure Functions para os webhooks com o portal do Azure. Em alternativa, pode consultar o artigo Criar Azure Functions para webhooks do SharePoint com um modelo azd, para automatizar todo o processo com um modelo azd.
Criar um Aplicativo Azure Function
A primeira etapa que você precisa fazer é criar um Aplicativo Azure Function, que é um aplicativo Web especial do Azure focado na hospedagem de Azure Functions.
Navegue até https://portal.azure.com, pesquise aplicativo de funções. Selecione aplicativo de funções nos resultados da pesquisa.
Clique na adicionar configuração.
Preencha as informações necessárias para criar o Aplicativo de Funções e clique em Examinar + criar.
Clique em Criar.
Quando a implantação for concluída, clique Ir para o recurso.
Criar uma Função do Azure
Agora que o aplicativo para hospedar as funções está pronto, você pode continuar criando sua primeira função do Azure clicando no link Nova função.
Isso oferece que você inicie sua função a partir de um modelo; para webhooks do SharePoint, precisamos de uma função disparada por HTTP e, como estamos escrevendo código em nosso exemplo, isso significa que estamos usando o modelo de função C# HttpTrigger-CSharp.
Selecione a opção ambiente de desenvolvimento no portal e clique em Continuar.
Selecione tipo de gatilho Webhook + API e clique em Criar.
O resultado será uma Função do Azure "padrão" gravada em C#.
No nosso caso, queremos que essa função Azure se comporte como um serviço webhook do SharePoint, então precisaremos implementar o seguinte em C#:
- Retorne o validationtoken, se especificado, como um parâmetro de URL para a chamada. Isso é necessário conforme descrito em Criar uma nova assinatura e o SharePoint espera que a resposta aconteça em 5 segundos.
- Processe a notificação de webhook JSON. No exemplo a seguir, optamos por armazenar o JSON em uma fila de armazenamento para que um trabalho de Web Azure possa começar a funcionar e processá-lo de forma assíncrona.
- Dependendo das suas necessidades, você também pode processar a notificação diretamente em seu serviço webhook, mas tenha em mente que todas as chamadas de serviço webhook devem ser concluídas em 5 segundos; então, é recomendável usar um modelo assíncrono.
Você pode fazer isso substituindo o código padrão pelo seguinte código:
#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 sua função Azure
Como escolhemos o modelo correto para iniciar nossa configuração, ela está quase concluída. A única coisa que você ainda precisa fazer é configurar o Armazenamento de Filas do Azure como uma associação de saída para que possamos adicionar mensagens à fila à medida que elas chegam.
Selecione Integrar e, em seguida, nova saída adicionar a associação de saída.
Selecione Armazenamento de Filas do Azure como o tipo de associação e clique em Selecionar.
Clique em Salvar.
Testar sua Função do Azure (Teste de Token de Validação)
Agora você está pronto para seu teste de Função do Azure.
Navegue de volta para a tela de código clicando no nome da função HttpTrigger1 no painel de navegação. Em seguida, clique guia teste para abrir o painel de teste à direita.
Adicione um parâmetro de URL validationtoken uma cadeia de caracteres aleatória como valor.
Usando essa configuração, estamos imitando o comportamento do SharePoint chamando seu serviço de webhook ao validar uma nova adição de webhook.
Clique Executar para testar...
Se tudo correr bem, você verá na seção de logs que seu serviço foi chamado e que ele retornou o valor passado com uma resposta HTTP 200.
Testar sua Função do Azure (Teste de Evento de Lista do SharePoint)
Agora, para o segundo teste. Isso testará sua função como se ela fosse chamada por um evento de lista do SharePoint.
- No painel Teste, desmarque o validationtoken URL e substitua o corpo da solicitação pelo objeto JSON a seguir. Em seguida, clique Executar.
{
"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"
}]
}
Se tudo estiver ok, você deverá ver todas as mensagens de log, incluindo a que indica que a mensagem foi adicionada à fila.
Obtenha o webhook da URL para usar em sua implementação
Precisaremos informar ao SharePoint qual webhook da URL estamos usando. Para fazer isso, vamos começar copiando a URL da função do Azure.
Clique Obter URL da função.
Clique Copiar para copiar a URL do Aplicativo de Funções do Azure para a área de transferência.
Então no nosso caso, a URL webhook a usar é a seguinte:
https://fa-acto-spwebhook-dev-westus.azurewebsites.net/api/HttpTrigger1?code=LTFbMHrbVVQkhbL2xUplGRmY5XnAI9q/E4s5jvfeIh00KsF9Y7QsJw==