【问题标题】:Publishing event from Azure DevOps to Azure Event Grid将事件从 Azure DevOps 发布到 Azure 事件网格
【发布时间】:2021-02-18 09:14:31
【问题描述】:

每当更新操作时,我都会使用 Webhook 将事件发布到 Azure 事件网格主题。但是当我使用主题中的访问密钥对请求进行身份验证时,我会看到类似

的错误

我做错了什么?

Reference for Azure docs

【问题讨论】:

    标签: azure-devops webhooks azure-eventgrid


    【解决方案1】:

    尝试以下方法:

    https://<yourtopic>.<region>.eventgrid.azure.net/api/events?aeg-sas-key=<your url encoded key>
    

    以下是有效负载的事件架构:

    [
      {
        "topic": string,
        "subject": string,
        "id": string,
        "eventType": string,
        "eventTime": string,
        "data":{
          object-unique-to-each-publisher
        },
        "dataVersion": string,
        "metadataVersion": string
      }
    ]
    

    更新:

    输出绑定到 AEG 自定义主题的 HttpTrigger 函数示例:

    运行.csx:

    #r "Newtonsoft.Json"
    #r "Microsoft.Azure.EventGrid"
    
    using System.Net;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Primitives;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    using Microsoft.Azure.EventGrid.Models;
    
    public static async Task<IActionResult> Run(JObject body, IAsyncCollector<EventGridEvent> outputEvents, ILogger log)
    {
        log.LogInformation($"{body.ToString(Formatting.Indented)}");
    
        EventGridEvent ege = new EventGridEvent() {
            Topic = null,
            Id = (string)body["id"],
            EventType = (string)body["eventType"],
            EventTime = (DateTime)body["createdDate"],
            Data = body,
            DataVersion = "1",
            Subject = "abcd"
        };
        await outputEvents.AddAsync(ege);
    
        return (ActionResult)new NoContentResult(); 
    }
    

    function.json:

    {
      "bindings": [
        {
          "authLevel": "function",
          "name": "body",
          "type": "httpTrigger",
          "direction": "in",
          "methods": [
             "post"
          ]
        },
        {
          "type": "eventGrid",
          "direction": "out",
          "name": "outputEvents",
          "topicEndpointUri": "AEG_TOPIC_XX_ENDPOINT",
          "topicKeySetting": "AEG_TOPIC_XX_KEY"
        },
        {
          "name": "$return",
          "type": "http",
          "direction": "out"
        }
      ]
    }
    
    enter code here
    

    【讨论】:

    • 早先试过这个。这会在读取 JSON 时给出一个单独的错误错误消息 Unexpected token。预期:StartArray,实际:StartObject。
    • 你是用邮递员还是其他客户端试试?
    • 注意,事件负载必须是一个数组,见事件架构docs.microsoft.com/en-us/azure/event-grid/event-schema
    • 基于docs.microsoft.com/en-us/azure/devops/service-hooks/services/…,我建议使用带有AEG输出绑定的天蓝色函数(HttpTrigger),详情请参阅docs.microsoft.com/en-us/azure/azure-functions/…
    • 啊哈!我正在使用 Webhook 上的测试按钮来测试它,但它不起作用,我现在查看了发送的请求,它不在指定的事件模式中。我使用链接中的示例使用邮递员进行了测试,我看到 200。看起来我无法使用 webhook 从 ADO 将事件直接发送到事件网格。我知道的唯一选择是拦截逻辑应用程序的请求,然后以指定的格式转发到事件网格。非常感谢。
    【解决方案2】:

    根据你的错误信息:

    这是由于:Base-64 字符数组或字符串的长度无效。

    您的 url 编码密钥的长度可能不是 4 的倍数。

    要解决此问题,请将=s 添加到密钥末尾,直到密钥长度为 4 的倍数。

    如您附加的链接所示:

    aeg-sas-key: XXXXXXXXXXXXXXXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==
    

    原来的key是nDT4hgdEj9DpBeRr38arnnm5OFg,但是为了做成Base-64字符串,后面加了两个=,变成了nDT4hgdEj9DpBeRr38arnnm5OFg==

    【讨论】:

    • 使用其 webhook 将事件发布到自定义主题端点的问题似乎在有效负载模式中,请参阅我的答案的 cmets。
    猜你喜欢
    • 2021-11-02
    • 2019-08-05
    • 1970-01-01
    • 2018-12-12
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2020-05-17
    相关资源
    最近更新 更多