Лазурный.Исключение RequestFailedException: Неожиданное свойство ‘source’ найдено в JSON

#azure #azure-eventgrid

#azure #azure-eventgrid

Вопрос:

Я использую Azure.Обмен сообщениями.EventGrid версии 4.0.0-beta.4 для публикации событий в разделе сетки событий.

Я думаю, что у меня правильно настроен клиент, и я вызываю правильный метод для публикации событий, но я получил это исключение:

 Azure.RequestFailedException: 'Service request failed. 
Status: 400 (Unexpected property 'source' found in JSON. Expected: 
StartObject, actual: StartArray)
 

Вот мой код, основанный на приведенных здесь примерах:

 Uri endpoint = new Uri("myEndpoint");
string accessKey = "myAccessKey";
string topicName = "MyTopic1";

EventGridPublisherClient client = new EventGridPublisherClient(
    endpoint, 
    new AzureKeyCredential(accessKey));

MyCustomObj obj = new MyCustomObj() {
     Description = "Test description",
     Name = "Test name",
     Id = 1234};

List<EventGridEvent> eventsList = new List<EventGridEvent>
    {
        new EventGridEvent(
            obj,
            "myCustomObject",
            "myEventType",
            "v1"
        )
    };

await client.SendEventsAsync(eventsList);
 

Ответ №1:

Я разобрался с проблемой. Оказывается , я должен публиковать CloudEvent вместо EventGridEvent . Потратив много времени на Azure Portal, я обнаружил, что тема, которую я пытаюсь опубликовать, принимает только CloudEvent . Поиск этой информации занял много времени, потому что она очень скрыта. Но вот как я это нашел:

Когда вы находитесь на вкладке Обзор, прямо над ней есть ссылка «Представление в формате Json», где вы найдете «Конечная точка темы».: введите описание изображения здесь

Нажмите на нее и выберите последнюю версию API. Здесь это говорит мне inputSchema о том, что CloudEventSchemaV1_0 :

введите описание изображения здесь

После изменения типа события я смог опубликовать событие:

 List<CloudEvent> eventsList = new List<CloudEvent>
    {
        new CloudEvent(
            "localhost",
            "myEventType",
            obj
        )
    };

await client.SendEventsAsync(eventsList);
 

Это не должно было вызвать столько проблем…

В любом случае… Побочный момент, который меня все еще смущает, — это почему атрибуты CloudEvent отличаются от EventGridEvent атрибутов ? Кроме того, у одного есть атрибут версии данных, а у другого его нет. Как мне выбрать, что использовать?