обработчики веб-перехватчиков ASP.NET

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

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

Схема свойств порядка обработчика веб-перехватчика

При необходимости обработчик может задать свойство Response в WebHookHandlerContext, что приведет к остановке обработки и отправке ответа обратно в качестве ОТВЕТА HTTP на веб-перехватчик. В приведенном выше случае обработчик C не будет вызываться, так как он имеет более высокий порядок, чем B, и B задает ответ.

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

Еще один распространенный способ использования ответа — использовать ответ 410 Gone , чтобы указать, что веб-перехватчик больше не активен и больше не следует отправлять запросы.

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

Обработка веб-перехватчика

При вызове обработчика он получает объект WebHookHandlerContext , содержащий сведения о запросе веб-перехватчика. Данные, как правило, текст HTTP-запроса, доступны в свойстве Data .

Типом данных обычно являются данные json или HTML-формы, но при необходимости можно привести к более конкретному типу. Например, пользовательские веб-перехватчики, созданные ASP.NET веб-перехватчиками, можно привести к типу CustomNotifications следующим образом:

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);
    }
}

Обработка в очереди

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

Если обработка занимает больше времени или лучше обрабатывать отдельно, можно использовать WebHookQueueHandler для отправки запроса веб-перехватчика в очередь, например в очередь службы хранилища Azure.

Схема реализации WebHookQueueHandler приведена здесь:

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

        // Enqueue WebHookQueueContext to your queuing system of choice

        return Task.FromResult(true);
    }
}