Azure耐用功能:JsonSerializationException通过将复杂对象从触发器传递到编排器

时间:2018-10-31 12:28:36

标签: azure azure-durable-functions

我具有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();
    }

orchestrator函数正在接收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。

2 个答案:

答案 0 :(得分:0)

我可以想到3种可以尝试的解决方案:

  • 1-使用构造函数将EventData包装在您自己的类中(可能通过继承?)。
  • 2-尝试强制转换为对象,怀疑是否可以,但是值得一试,因为它是一个简单的解决方法。
  • 3-构建您自己的DTO(数据传输对象)以将EventData转换为<your class>,然后将<your class>传递给业务流程。

我认为(3)是最干净的解决方案,您可以完全控制自己通过的内容,不幸的是,它可能是性能最低且最乏味的。

祝你好运!

答案 1 :(得分:0)

使用LINQ转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}");

}