обработчики ASP.NET WebHooksASP.NET WebHooks handlers

После проверки запросов WebHooks приемником WebHook готов к обработке с помощью пользовательского кода.Once WebHooks requests has been validated by a WebHook receiver, it is ready to be processed by user code. Это где обработчики приходят дюймаThis is where handlers come in. Обработчики вытекают из интерфейса IWebHookHandler, но обычно используют класс WebHookHandler вместо того, чтобы выводятся непосредственно из интерфейса.Handlers derive from the IWebHookHandler interface but typically uses the WebHookHandler class instead of deriving directly from the interface.

Запрос WebHook может быть обработан одним или несколько обработчиками.A WebHook request can be processed by one or more handlers. Обработчики называются в порядке, основанном на их соответствующем свойстве Заказа, переходяот из самого низкого к самому высокому, где Заказ является простым рядом (предлагается быть между 1 и 100):Handlers are called in order based on their respective Order property going from lowest to highest where Order is a simple integer (suggested to be between 1 and 100):

Диаграмма обработчика Обработчика WebHook

Обработчик может дополнительно установить свойство ответа на WebHookHandlerContext, что приведет к остановке обработки и отправке ответа обратно в качестве ответа HTTP на WebHook.A handler can optionally set the Response property on the WebHookHandlerContext which will lead the processing to stop and the response to be sent back as the HTTP response to the WebHook. В приведенном выше случае обработчик C не будет вызываться, поскольку он имеет более высокий порядок, чем B и B устанавливает ответ.In the case above, Handler C won't get called because it has a higher order than B and B sets the response.

Настройка ответа обычно актуальна только для WebHooks, где ответ может донести информацию до исходного API.Setting the response is typically only relevant for WebHooks where the response can carry information back to the originating API. Это, например, случай с Slack WebHooks, где ответ размещается обратно на канал, откуда пришел WebHook.This is for example the case with Slack WebHooks where the response is posted back to the channel where the WebHook came from. Обработчики могут установить свойство получателя, если они хотят получать WebHooks от этого конкретного получателя.Handlers can set the Receiver property if they only want to receive WebHooks from that particular receiver. Если они не устанавливают приемник, они призваны для всех из них.If they don't set the receiver they are called for all of them.

Еще одно распространенное использование ответа заключается в использовании ответа 410 Gone, чтобы указать, что WebHook больше не активен и никакие дополнительные запросы не должны быть представлены.One other common use of a response is to use a 410 Gone response to indicate that the WebHook no longer is active and no further requests should be submitted.

По умолчанию обработчик будет вызываться всеми приемниками WebHook.By default a handler will be called by all WebHook receivers. Однако, если свойство получателя настроено на имя обработчика, то этот обработчик будет получать запросы WebHook только от этого получателя.However, if the Receiver property is set to the name of a handler then that handler will only receive WebHook requests from that receiver.

Обработка WebHookProcessing a WebHook

При вызове обработчика он получает WebHookHandlerContext, содержащий информацию о запросе WebHook.When a handler is called, it gets a WebHookHandlerContext containing information about the WebHook request. Данные, как правило, орган запроса HTTP, доступны из свойства данных.The data, typically the HTTP request body, is available from the Data property.

Тип данных обычно JSON или HTML-формы данных, но можно отбросить на более конкретный тип при желании.The type of the data is typically JSON or HTML form data, but it is possible to cast to a more specific type if desired. Например, пользовательские WebHooks, генерируемые ASP.NET WebHooks, могут быть отброшены в тип Пользовательских Уведомлений следующим образом:For example, the custom WebHooks generated by ASP.NET WebHooks can be cast to the type CustomNotifications as follows:

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

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

Большинство отправителей WebHook отправит веб-крюк, если ответ не генерируется в течение нескольких секунд.Most WebHook senders will resend a WebHook if a response is not generated within a handful of seconds. Это означает, что обработчик должен завершить обработку в течение этого периода времени, чтобы не вызываться снова.This means that your handler must complete the processing within that time frame in order not for it to be called again.

Если обработка занимает больше времени или лучше обрабатывать отдельно, то WebHookQueueHandler можно использовать для отправки запроса WebHook в очередь, например очередь хранения Azure.If the processing takes longer, or is better handled separately then the WebHookQueueHandler can be used to submit the WebHook request to a queue, for example Azure Storage Queue.

Наброски реализации WebHook'ueAn outline of a WebHookQueueHandler implementation is provided here:

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

        // Enqueue WebHookQueueContext to your queuing system of choice

        return Task.FromResult(true);
    }
}