2

我有一个带有 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();
    }

协调器函数正在接收事件数据:

    [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。

4

2 回答 2

1

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

  • 1 - 使用构造函数将 EventData 包装在您自己的类中(可能通过继承?)。
  • 2 - 尝试投射到对象,怀疑这会起作用,但值得一试,因为它是一个简单的修复。
  • 3 - 构建您自己的 DTO(数据传输对象)以将 EventData 转换为<your class>然后传递<your class>给编排。

我认为(3)是最干净的解决方案,你可以完全控制你通过的东西,不幸的是它可能是性能最差和最乏味的。

祝你好运!

于 2018-10-31T12:45:31.947 回答
0

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

}
于 2020-01-07T20:30:23.490 回答