Функция azure durable: jsonserializationexception путем передачи сложного объекта из триггера в оркестратор.

У меня есть лазурная функция с 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 () получаю исключение:

Function 'O_ProcessTradesFromEventHub (Orchestrator)' failed with an error. Reason: Newtonsoft.Json.JsonSerializationException: Unable to find a constructor to use for type Microsoft.Azure.EventHubs.EventData. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'Body', line 1, position 81.

2
0
710
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

Удачи!

Используйте LINQ to JSON - год спустя, но, надеюсь, это сэкономит время кому-то еще.

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public static async Task Run(
    [OrchestrationTrigger] DurableOrchestrationContext context, ILogger log) {

    var eventData = context.GetInput<JObject>();
    log.LogInformation ($"Executing tasks with eventData = {eventData}");

    string step = (string)eventData.SelectToken("Step");
    log.LogInformation ($"Step = {step}");

}

Другие вопросы по теме