Azure Сбой проверки подписки на сетку событий с помощью облачной схемы событий v1.0 - PullRequest
0 голосов
/ 07 января 2020

При попытке создать подписку WebHook при развертывании не удается проверить триггер HTTP в Azure Функции для схемы Cloud Events v1.0. Я подтвердил, что моя конечная точка обрабатывает подтверждение подтверждения с соответствующим ответом. Мой домен сетки событий использует схему Cloud Events v1.0. Похоже, что моя Azure функция даже не вызывается во время проверки, потому что в консоли функции нет вывода.

Должно ли это работать для Cloud Events v1.0 и WebHooks?

Развертывание не выполнено со следующей ошибкой: {"code": "Проверка URL-адреса", "message": "Попытка проверки предоставленной конечной точки xxxxx не удалась."}

Вот мой код:

[FunctionName("ProcessEvent")]
        public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestMessage req, ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            var requestmessage = await req.Content.ReadAsStringAsync();
            var message = JToken.Parse(requestmessage);

            if (message.Type == JTokenType.Array)
            {
                // If the request is for subscription validation, send back the validation code.
                if (string.Equals((string)message[0]["eventType"],
                "Microsoft.EventGrid.SubscriptionValidationEvent",
                System.StringComparison.OrdinalIgnoreCase))
                {
                    log.LogInformation("Validate request received");

                    var myObj = new { validationResponse = message[0]["data"]["validationCode"].ToString() };
                    var jsonToReturn = JsonConvert.SerializeObject(myObj);

                    return new HttpResponseMessage(HttpStatusCode.OK)
                    {
                        Content = new StringContent(jsonToReturn, Encoding.UTF8, "application/json")
                    };
                }
            }
            else
            {
                // The request is not for subscription validation, so it's for an event.
                // CloudEvents schema delivers one event at a time.
                log.LogInformation($"Source: {message["source"]}");
                log.LogInformation($"Time: {message["eventTime"]}");
                log.LogInformation($"Event data: {message["data"].ToString()}");
            }

            return req.CreateResponse(HttpStatusCode.OK);
}

1 Ответ

0 голосов
/ 07 января 2020

Проверка конечной точки с помощью CloudEvents v1.0 отличается от схемы доставки, такой как EventGridSchema и CustomInputSchema , описанной здесь.

В целях тестирования вы можете использовать Webhook.site в качестве обработчика конечной точки. На следующем экране показана отправка вызова OPTIONS с помощью EventGrid для подтверждения подтверждения:

enter image description here

Обратите внимание, что адрес для обработчик конечной точки должен быть https . Как вы можете видеть на картинке выше, есть заголовок webhook-request-callback . Скопируйте значение a, поместите его в браузер и отправьте. Вы должны получить следующий текст:

"Webhook succesfully validated as a subscription endpoint."

С этого момента веб-крючок может получать уведомления, см. Следующий экран:

enter image description here

Как видите, CloudEvent v1.0 требует реализации ответа HTTP OPTIONS для проверки конечной точки . Ниже приведен пример этой реализации:

string webhookcallback = req.Headers.GetValues("WebHook-Request-Callback")?.FirstOrDefault()?.Trim();       
if(string.IsNullOrEmpty(webhookcallback) == false)
{
    var hrm2 = req.CreateResponse(HttpStatusCode.OK);
    hrm2.Headers.Add("WebHook-Request-Origin", "eventgrid.azure.net");
    hrm2.Headers.Add("WebHook-Allowed-Rate", "120");

    System.Threading.ThreadPool.QueueUserWorkItem(delegate (object state)
    {
        Task.Delay(5000).Wait();
        using(var client = new HttpClient())
        {
            log.Warning($"{client.GetAsync(webhookcallback).Result.Content.ReadAsStringAsync().Result}");
        }
    });

    return hrm2;
}

Поместите приведенный выше фрагмент кода в вашу функцию. Обратите внимание, что вызов WebHook-Request-Callback address не может быть в пределах вызова OPTIONS, это должно быть сделано после его ответа OK обратно на EventGrid, поэтому у нас есть некоторая задержка и фоновый поток. Будет хорошо, если EventGrid примет этот вызов в рамках вызова OPTIONS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...