Обработка WebHooks

После того как запросы WebHooks валидированы получателем WebHook, их можно обработать с помощью пользовательского кода. Здесь вступают в игру обработчики. Обработчики наследуются от интерфейса IWebHookHandler, но обычно используют класс WebHookHandler, вместо того чтобы напрямую наследоваться от интерфейса.

Запрос WebHook может обрабатываться несколькими обработчиками. Обработчики вызываются в зависимости от свойства Order, где Order - это простое целое число (от 1 до 100), и приоритет идет от меньшего числа к большему:

../_images/Handlers.png

Дополнительно обработчик может настроить свойство Response для WebHookHandlerContext, которое останавливает обработку, а ответ отправляется обратно в виде HTTP ответа WebHook. В примере выше обработчик C не будет вызван, поскольку его порядок выше, чем у B, а B настраивает ответ.

Настройка ответа обычно релевантна только для тех WebHooks, где ответ может отправлять информацию нужному API. Это касается, например, Slack WebHooks, где ответ отправляется обратно каналу, откуда пришел WebHook. Обработчики могут настраивать только свойство Receiver, если они хотят только получать WebHooks. Если получатель не настроить, то они будут вызываться для всех обработчиков.

Также зачастую мы используем ответ 410 Gone, чтобы обозначить, что WebHook более не активен и больше не нужно отправлять запросы.

По умолчанию обработчик вызывается получателем WebHook. Однако если свойство Receiver установлено на имя обработчика, тогда этот обработчик будет только получать WebHook запросы.

Обработка WebHook

При вызове обработчика он получает WebHookHandlerContext, содержащий информацию о WebHook запросе. Данные, обычно тело HTTP запроса, доступны из свойства Data.

Данные обычно представлены в формате JSON или HTML, но их можно перевести и в другой формат. Например, пользовательские WebHooks, которые сгенерированы ASP.NET WebHooks, могут иметь тип CustomNotifications:

public class MyWebHookHandler : WebHookHandler
{
    public CustomWebHookHandler()
    {
        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);
    }
}

Очередность обработки

Большинство отправителей WebHook будут заново отправлять WebHook, если ответ не сгенерирован в течение нескольких секунд. Это обозначает, что обработчик должен завершить работу по истечении определенного времени, чтобы его не нужно было вызывать снова.

Если обработка занимает больше времени, тогда можно использовать WebHookQueueHandler, чтобы добавить WebHook запрос в очередь, например, Azure Storage Queue.

Вот реализация WebHookQueueHandler:

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

        // Enqueue WebHookQueueContext to your queuing system of choice

        return Task.FromResult(true);
    }
}
Поделись хорошей новостью с друзьями!
Следи за новостями!