ASP.NET manipuladores WebHooks

Depois que as solicitações de WebHooks tiverem sido validadas por um receptor WebHook, elas estarão prontas para serem processadas pelo código do usuário. É aí que entram os manipuladores . Os manipuladores derivam da interface IWebHookHandler , mas normalmente usam a classe WebHookHandler em vez de derivar diretamente da interface .

Uma solicitação do WebHook pode ser processada por um ou mais manipuladores. Os manipuladores são chamados em ordem com base em sua respectiva propriedade Order indo do mais baixo para o mais alto, em que Order é um inteiro simples (sugerido estar entre 1 e 100):

Diagrama de propriedade da ordem do manipulador webhook

Opcionalmente, um manipulador pode definir a propriedade Response no WebHookHandlerContext, o que levará o processamento a parar e a resposta a ser enviada de volta como a resposta HTTP para o WebHook. No caso acima, o Manipulador C não será chamado porque tem uma ordem maior que B e B define a resposta.

A configuração da resposta normalmente só é relevante para WebHooks em que a resposta pode levar informações de volta para a API de origem. Esse é, por exemplo, o caso com o Slack WebHooks em que a resposta é postada de volta no canal de origem do WebHook. Os manipuladores podem definir a propriedade Receiver se quiserem receber somente WebHooks desse receptor específico. Se eles não definirem o receptor, eles serão chamados para todos eles.

Outro uso comum de uma resposta é usar uma resposta 410 Gone para indicar que o WebHook não está mais ativo e nenhuma solicitação adicional deve ser enviada.

Por padrão, um manipulador será chamado por todos os receptores WebHook. No entanto, se a propriedade Receiver estiver definida como o nome de um manipulador, esse manipulador receberá apenas solicitações de WebHook desse receptor.

Processando um WebHook

Quando um manipulador é chamado, ele obtém um WebHookHandlerContext que contém informações sobre a solicitação do WebHook. Os dados, normalmente o corpo da solicitação HTTP, estão disponíveis na propriedade Data .

O tipo dos dados normalmente são dados de formulário JSON ou HTML, mas é possível converter em um tipo mais específico, se desejado. Por exemplo, os WebHooks personalizados gerados por ASP.NET WebHooks podem ser convertidos no tipo CustomNotifications da seguinte maneira:

public class MyWebHookHandler : WebHookHandler
{
    public MyWebHookHandler()
    {
        this.Receiver = "custom";
    }

    public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
    {
        CustomNotifications notifications = context.GetDataOrDefault<CustomNotifications>();
        foreach (var notification in notifications.Notifications)
        {
            ...
        }
        return Task.FromResult(true);
    }
}

Processamento enfileirado

A maioria dos remetentes do WebHook reenviará um WebHook se uma resposta não for gerada dentro de alguns segundos. Isso significa que o manipulador deve concluir o processamento dentro desse período para que ele não seja chamado novamente.

Se o processamento demorar mais ou for melhor tratado separadamente, o WebHookQueueHandler poderá ser usado para enviar a solicitação webHook para uma fila, por exemplo, Fila de Armazenamento do Azure.

Uma estrutura de tópicos de uma implementação de WebHookQueueHandler é fornecida aqui:

public class QueueHandler : WebHookQueueHandler
{
    public override Task EnqueueAsync(WebHookQueueContext context)
    {

        // Enqueue WebHookQueueContext to your queuing system of choice

        return Task.FromResult(true);
    }
}