Публикация события из Azure DevOps в Azure Event Grid

Я использую веб-перехватчик для публикации событий в теме сетки событий Azure при каждом обновлении действия. Но когда я использую ключ доступа из темы для аутентификации запроса, я вижу ошибку вроде

Ошибка

Что я делаю неправильно?

Справочник по документации Azure


person Ashutosh    schedule 05.11.2020    source источник


Ответы (2)


попробуйте следующее:

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
  }
]

ОБНОВЛЕНИЕ:

Пример функции HttpTrigger с привязкой вывода к настраиваемой теме AEG:

run.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
person Roman Kiss    schedule 05.11.2020
comment
Пробовал это раньше. Это дает отдельное сообщение об ошибке Неожиданный токен сообщения об ошибке при чтении JSON. Ожидаемый: StartArray, фактический: StartObject. - person Ashutosh; 06.11.2020
comment
Вы пробовали это с помощью почтальона или какого-нибудь отдыхающего клиента? - person Roman Kiss; 06.11.2020
comment
Обратите внимание, что полезная нагрузка события должна быть массивом, см. Схему события docs.microsoft.com/en-us/azure/event-grid/event-schema - person Roman Kiss; 06.11.2020
comment
На основе docs.microsoft .com / en-us / azure / DevOps / service-hooks / services /, я рекомендую использовать функцию azure (HttpTrigger) с выходной привязкой для AEG, подробности см. docs.microsoft.com/en-us/azure/ лазурные функции / - person Roman Kiss; 06.11.2020
comment
Ага! Я использовал кнопку «Тест» на веб-перехватчике, чтобы проверить это, и она не работала. Теперь я посмотрел на отправленный запрос, которого нет в указанной схеме событий. Я тестировал почтальон с примером в ссылке и вижу 200. Похоже, я не смогу отправлять события напрямую в сетку событий из ADO с помощью веб-перехватчиков. Единственный известный мне вариант - это перехватить запрос приложениями логики, а затем перенаправить его в указанном формате в сетку событий. Благодаря тонну. - person Ashutosh; 06.11.2020
comment
Это правильно, проблема в схеме событий ADO, такой как один объект, а схема событий AEG требует массива событий (включая также и для одного события). Я много раз отмечал команде AEG об этой проблеме, это должно быть так же, как и для CloudEventSchemaV1_0, где тип содержимого указывается как пакет событий. - person Roman Kiss; 06.11.2020
comment
Я добавил рабочий пример интеграции веб-перехватчика ADO в конечную точку настраиваемой темы AEG. - person Roman Kiss; 06.11.2020

Согласно вашему сообщению об ошибке:

Это происходит по следующей причине: недопустимая длина массива или строки символов Base-64.

Длина ключа, закодированного для URL-адреса, не может быть кратной 4.

Чтобы решить эту проблему, добавляйте =s в конец вашего ключа, пока длина ключа не станет кратной 4.

Как показано в прикрепленной ссылке:

aeg-sas-key: XXXXXXXXXXXXXXXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

Первоначальный ключ был nDT4hgdEj9DpBeRr38arnnm5OFg, но чтобы сделать его строкой Base-64, после него были добавлены два =, что сделало его nDT4hgdEj9DpBeRr38arnnm5OFg==.

person Jane Ma-MSFT    schedule 06.11.2020
comment
похоже, что проблема с использованием его веб-перехватчика для публикации события в конечной точке настраиваемой темы находится в схеме полезной нагрузки, см. комментарии к моему ответу. - person Roman Kiss; 06.11.2020