ASP.NET WebHooks 처리기

WebHook 수신자가 WebHook 요청의 유효성을 검사하면 사용자 코드에서 처리할 준비가 된 것입니다. 처리기가 들어오는 위치입니다. 처리기는 IWebHookHandler 인터페이스에서 파생되지만 일반적으로 인터페이스에서 직접 파생되는 대신 WebHookHandler 클래스를 사용합니다.

WebHook 요청은 하나 이상의 처리기에서 처리할 수 있습니다. 처리기는 Order가 단순 정수(1에서 100 사이로 제안됨)인 가장 낮은 순서에서 가장 높은 순서로 가는 각 Order 속성에 따라 순서대로 호출됩니다.

WebHook 처리기 순서 속성 다이어그램

처리기는 필요에 따라 WebHookHandlerContext에서 Response 속성을 설정할 수 있습니다. 그러면 처리가 중지되고 응답이 WebHook에 대한 HTTP 응답으로 다시 전송됩니다. 위의 경우 처리기 C는 B보다 순서가 높고 B는 응답을 설정하므로 호출되지 않습니다.

응답 설정은 일반적으로 응답이 원래 API로 정보를 다시 전송할 수 있는 WebHook에만 관련이 있습니다. 예를 들어 응답이 WebHook이 제공된 채널에 다시 게시되는 Slack WebHook의 경우입니다. 처리기는 특정 수신기에서 WebHook만 수신하려는 경우 Receiver 속성을 설정할 수 있습니다. 수신기를 설정하지 않으면 모두 호출됩니다.

응답의 또 다른 일반적인 용도는 410 Gone 응답을 사용하여 WebHook이 더 이상 활성 상태가 아니고 추가 요청을 제출하지 않아야 함을 나타내는 것입니다.

기본적으로 처리기는 모든 WebHook 수신기에서 호출됩니다. 그러나 Receiver 속성이 처리기의 이름으로 설정된 경우 해당 처리기는 해당 수신기에서 WebHook 요청만 수신합니다.

WebHook 처리

처리기가 호출되면 WebHook 요청에 대한 정보가 포함된 WebHookHandlerContext 를 가져옵니다. 일반적으로 HTTP 요청 본문인 데이터는 Data 속성에서 사용할 수 있습니다.

데이터 형식은 일반적으로 JSON 또는 HTML 양식 데이터이지만 원하는 경우 보다 구체적인 형식으로 캐스팅할 수 있습니다. 예를 들어 ASP.NET WebHooks에서 생성된 사용자 지정 WebHook을 다음과 같이 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);
    }
}

큐에 대기 중인 처리

응답이 몇 초 내에 생성되지 않으면 대부분의 WebHook 보낸 사람이 WebHook을 다시 보냅니다. 즉, 처리기가 다시 호출되지 않도록 해당 시간 프레임 내에서 처리를 완료해야 합니다.

처리 시간이 더 오래 걸리거나 별도로 더 잘 처리되는 경우 WebHookQueueHandler를 사용하여 WebHook 요청을 큐(예: Azure Storage 큐)에 제출할 수 있습니다.

WebHookQueueHandler 구현의 개요는 다음과 같습니다.

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

        // Enqueue WebHookQueueContext to your queuing system of choice

        return Task.FromResult(true);
    }
}