EventHubTrigger C# с объектом EventData - PullRequest
0 голосов
/ 21 января 2020

Я использую 1x функции, мой вопрос: если с этой версией я могу получить объект типа EventData.

Я прочитал документацию по этому поводу, но она мне не ясна.

При выполнении функции выдается следующее исключение:

mscorlib: Исключение при выполнении функции: eventHubTest. Microsoft. Azure .WebJobs.Host: Se han producido uno o var ios Ошибка. Параметр привязки исключения 'myEventHubMessage'. Microsoft. Azure .WebJobs.Host: Привязка параметров к сложным объектам (например, «EventData») использует сериализацию Json. NET. 1. Свяжите тип параметра как «string» вместо «EventData», чтобы получить необработанные значения и избежать десериализации JSON, или 2. Измените полезную нагрузку очереди на действительную json. Сбой синтаксического анализатора JSON: не удалось найти конструктор для использования с типом Microsoft. Azure .EventHubs.EventData. Класс должен иметь конструктор по умолчанию, один конструктор с аргументами или конструктор, помеченный атрибутом JsonConstructor. Путь 'Origen', строка 1, позиция 10.

Это заголовок функции:

using Microsoft.Azure.EventHubs;

[FunctionName("FunctionTest")]
     public static void Run(
         [EventHubTrigger("eventHubTest", Connection = "EventHubConnectionString", ConsumerGroup = "%EventHubConsumerGroup%")]
         EventData[] myEventHubMessage,
         ILogger log)

1 Ответ

1 голос
/ 21 января 2020

Предположим, я воспроизвожу вашу проблему. В моем тесте, если я использую класс EventData в пакете Microsoft.Azure.EventHubs, это вызовет эту проблему. Затем, после теста, я обнаружил, что это должно быть Microsoft.ServiceBus.Messaging.EventData, поэтому мое решение - изменить ссылку EventData на Microsoft.ServiceBus.Messaging, тогда это решит эту проблему.

Ниже приведен мой рабочий код, вы могли бы обратиться к нему.

using Microsoft.Azure.WebJobs;
using System.Text;
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Azure.WebJobs.ServiceBus;
using Microsoft.ServiceBus.Messaging;
using Microsoft.Azure.WebJobs.Host;

namespace FunctionApp14
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task RunAsync([EventHubTrigger("geoevent", Connection = "eventcon",ConsumerGroup = "geogroup")]EventData[] events, TraceWriter log)
        {

            var exceptions = new List<Exception>();

            foreach (EventData eventData in events)
            {
                try
                {
                    string messageBody = Encoding.UTF8.GetString(eventData.GetBytes());

                    // Replace these two lines with your processing logic.
                    log.Info($"C# Event Hub trigger function processed a message: {messageBody}");
                    await Task.Yield();
                }
                catch (Exception e)
                {
                    // We need to keep processing the rest of the batch - capture this exception and continue.
                    // Also, consider capturing details of the message that failed processing so it can be processed again later.
                    exceptions.Add(e);
                }
            }

            // Once processing of the batch is complete, if any messages in the batch failed processing throw an exception so that there is a record of the failure.

            if (exceptions.Count > 1)
                throw new AggregateException(exceptions);

            if (exceptions.Count == 1)
                throw exceptions.Single();
        }
    }
}
...