Долгосрочная функция Azure: исключение JsonSerializationException путем передачи сложного объекта из триггера в оркестратор - PullRequest
0 голосов
/ 31 октября 2018

У меня есть функция лазури с EventHubTrigger:

    [FunctionName("TradesDataProcessStarterEh")]
    public static async Task TradesDataProcessStarterEh([EventHubTrigger("aeehrobotronapiintegrationdev", Connection = "EventHubConnectionString", ConsumerGroup = "$Default")]
        EventData eventData, PartitionContext partitionContext, [OrchestrationClient] DurableOrchestrationClient starter, ILogger log)
    {
        if (partitionContext.PartitionId != "1")
            return;

        var orchestrationId = await starter.StartNewAsync("O_ProcessTradesFromEventHub", eventData);

        await partitionContext.CheckpointAsync();
    }

Функция оркестратора получает затем eventData:

    [FunctionName("O_ProcessTradesFromEventHub")]
    public static async Task ProcessTradesFromEventHub([OrchestrationTrigger] DurableOrchestrationContext context,
        ILogger log)
    {
        if (!context.IsReplaying)
            Console.WriteLine("O_ProcessTradesFromEventHub is triggered");

        var eventData = context.GetInput<EventData>();

        //do stuff...
    }

Но при выполнении context.GetInput () я получаю исключение:

Функция 'O_ProcessTradesFromEventHub (Orchestrator)' завершилась ошибкой. Причина: Newtonsoft.Json.JsonSerializationException: не удалось найти конструктор для использования для типа Microsoft.Azure.EventHubs.EventData. Класс должен иметь конструктор по умолчанию, один конструктор с аргументами или конструктор, помеченный атрибутом JsonConstructor. Путь «Тело», линия 1, позиция 81.

1 Ответ

0 голосов
/ 31 октября 2018

Я могу придумать 3 возможных решения, которые вы можете попробовать:

  • 1 - Оберните EventData в вашем собственном классе конструктором (возможно, через наследование?).
  • 2 - Попробуйте привести к объекту, сомневаюсь, что это сработает, но стоит попробовать, поскольку это простое исправление.
  • 3 - Создайте свой собственный DTO (объект передачи данных) для преобразования EventData в <your class>, а затем передайте <your class> в оркестровку.

Я думаю (3) - самое чистое решение, и вы имеете полный контроль над тем, что вы проходите, к сожалению, оно, вероятно, наименее производительное и наиболее утомительное.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...