当前位置: 首页 > 知识库问答 >
问题:

Azure事件网格订阅WebHook验证在Cloud Events Schema v1.0中失败

徐卓
2023-03-14

尝试创建WebHook订阅时,部署无法验证云事件1.0版架构的Azure函数中的HTTP触发器。我已经确认我的endpoint用适当的响应处理了验证握手。我的事件网格域使用的是云事件1.0版模式。看起来我的Azure函数在验证期间甚至没有被调用,因为在函数的控制台中没有输出。

这应该适用于 Cloud Events v1.0 和 WebHooks 吗?

部署失败,出现以下错误:{"code":"Url验证"," message ":"尝试验证提供的endpointxxxxx失败。"}

这是我的代码:

[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个答案

周龙光
2023-03-14

CloudEvents v1.0的endpoint验证不同于此处描述的EventGridSchema和CustomInputSchema等交付模式。

出于测试目的,您可以将Webhook.site用于endpoint处理程序。以下屏幕显示了EventGrid为其验证握手发送OPTIONS调用:

注意,endpoint处理程序的地址必须是https。上图可以看到,有一个webhook-request-callback头。复制它的值a放在浏览器上发送。您应该得到以下文本:

"Webhook succesfully validated as a subscription endpoint."

从现在开始,webhook可以收到一条通知消息,参见如下屏幕:

如您所见,CloudEvent v1.0需要为endpoint验证实现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-Request est-Callback地址不能在OPTIONS调用中,它必须在其OK响应返回EventGrid后完成,因此我们有一些延迟和后台线程。如果EventGrid在OPTIONS调用中接受此调用,那就太好了。

 类似资料:
  • 我无法在Azure事件网格中添加新的WebHook订阅。有人能帮忙吗?当我添加webhookendpoint时,出现以下错误。

  • 我在 中配置任何<code>传递属性(如授权或内容类型头),我将面临一个问题(无法订阅webhook),如下所示。请参阅下面的附件了解错误详细信息(如图右侧所示)。 具有 Webhook 传递属性的事件网格订阅失败 有人能帮我一下吗? 提前感谢, 阿育王

  • 我正试图开发一个Azure函数来处理由事件中心的捕获功能创建的blob。然而,尽管捕获blobs被正确地存储在容器中,但似乎没有< code>Microsoft。EventHub . capturefile created 事件发布到函数订阅。功能endpoint的事件订阅已创建,没有错误,Azure CLI的输出为 该函数的主体是一个标准的Http触发器,其中包含事件网格endpoint订阅所需

  • 我正在尝试过滤事件网格中的事件,使其仅在我的订阅中的Azure功能更改时触发(例如配置更改、代码更新或创建/删除新功能)。 我使用的 PowerShell 脚本如下所示: 这将过滤到所有功能和网站(请检查<code>和$AdvancedFilters)。是否有任何方法可以将事件仅过滤到Azure函数?欢迎使用Azure CLI、portal、Powershell或.net sdk中的任何解决方案帮

  • 基本上,我试图使用ARM部署一个事件网格订阅来收集订阅中的特定事件(主题类型= Azure订阅)。我已经有一个创建了事件网格触发功能的功能应用程序,只需要将该功能与事件网格订阅绑定为webhook。 我正在使用Azure DevOps中的发布管道来自动化整个工作流。 以下是我使用的一个示例: 这最终部署了事件网格主题,而不是事件网格订阅。 然后,有人建议我尝试以下操作: 但是这最终以这个错误而失败

  • 我目前正在使用节点js将主题发布到事件网格,并通过事件网格订阅主题。在https://docs.microsoft.com/en-us/rest/api/eventgrid/使用事件网格API时,我收到一个错误,其中我在创建订阅时无权执行操作。我创建了一个主题并具有访问我的Azure帐户的门禁权限,因此我不明白为什么会出现这个Rest错误。 我的代码: 输出: 感谢您的帮助!