Azure functions Azure事件网格订阅WebHook验证失败,云事件架构v1.0

Azure functions Azure事件网格订阅WebHook验证失败,云事件架构v1.0,azure-functions,azure-eventgrid,cloudevents,Azure Functions,Azure Eventgrid,Cloudevents,尝试创建WebHook订阅时,部署无法验证Azure函数中的HTTP触发器是否符合Cloud Events v1.0架构。我已确认我的端点使用适当的响应处理验证握手。我的事件网格域正在使用Cloud Events v1.0架构。我的Azure函数在验证期间似乎没有被调用,因为该函数的控制台中没有输出 这是否适用于云事件v1.0和WebHooks 部署失败,出现以下错误:{代码:Url验证,消息:尝试验证提供的终结点xxxxx失败。} 这是我的密码: [FunctionName("ProcessE

尝试创建WebHook订阅时,部署无法验证Azure函数中的HTTP触发器是否符合Cloud Events v1.0架构。我已确认我的端点使用适当的响应处理验证握手。我的事件网格域正在使用Cloud Events v1.0架构。我的Azure函数在验证期间似乎没有被调用,因为该函数的控制台中没有输出

这是否适用于云事件v1.0和WebHooks

部署失败,出现以下错误:{代码:Url验证,消息:尝试验证提供的终结点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);
}

使用的端点验证不同于此处描述的传递模式,如EventGridSchema和CustomInputSchema

出于测试目的,您可以将Webhook.site用于端点处理程序。 以下屏幕显示EventGrid发送选项调用以进行验证握手:

注意,端点处理程序的地址必须是https。 如上图所示,有一个webhook请求回调头。将其值a复制到浏览器上并发送。您应该获得以下文本:

"Webhook succesfully validated as a subscription endpoint."
从现在起,webhook可以收到通知消息,请参见以下屏幕:

正如您所看到的,CloudEventV1.0需要为实现HTTP选项响应。以下是此实现的示例:

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请求回调地址不能在选项调用内,它必须在其OK响应返回EventGrid后完成,因此我们有一些延迟和后台线程。如果EventGrid在选项调用中接受此调用,那就太好了。

您能详细描述一下您的端点是如何处理云事件v1.0的验证握手的吗?是的,我们可以为eventDeliverySchema=CloudEventSchemaV1使用webhook端点处理程序_0@RomanKiss我为Azure函数添加了验证代码。请查看我的答案。谢谢!我对一些指向验证部分的文档感到困惑。谢谢你的澄清。这很管用。我还建议首先为标题添加一个检查,这样如果它不存在,就不会抛出异常。ifreq.Headers.ContainsWebHook请求回调{}这是正确的,我还检查了Aeg事件类型的头,因此事件处理程序可以用于其他当前传递模式,如EventGridSchema和CustomInputSchema。