升级到 .Net 6 和 Fuctions 4 后出现 EventData JSON 反序列化错误

EventData JSON deserialization error after upgrading to .Net 6 and Fuctions 4

我正在将带有 Functions v3 的 .Net 3.1 升级到带有 Functions v4 的 .Net 6,我有这个 EventHubTrigger:

[EventHubTrigger("clean-station-kfi-v1", Connection = "EventHubCleanConnectionString", ConsumerGroup = "local-testing")] EventData[] eventHubMessages

升级后出现此错误:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function: KfiPersister
 ---> System.InvalidOperationException: Exception binding parameter 'eventHubMessages'
 ---> System.InvalidOperationException: Binding parameters to complex objects (such as 'EventData') uses Json.NET serialization. 
1. Bind the parameter type as 'string' instead of 'EventData' to get the raw values and avoid JSON deserialization, or
2. Change the queue payload to be valid json. The JSON parser failed: 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 'Id', line 1, position 6.

我正在使用 Microsoft.Azure.WebJobs.Extensions.EventHubs 版本 5.0.1

我有这个使用:

using Microsoft.Azure.EventHubs;

我确实找到了一些关于使用不同命名空间的信息:

using Azure.Messaging.EventHubs;

这是正确的路径吗?我该如何解决这里的问题?切换到该名称空间会导致许多其他问题:)

谢谢
索伦

从 v5.0 开始,Microsoft.Azure.WebJobs.Extensions.EventHubs 包在内部移动到 Azure.Messaging.EventHubs 包。这意味着函数签名中公开的类型源自该包。

由于您的应用程序包含 Microsoft.Azure.EventHubs 的 using 语句,您签名中的类型被解释为:

[EventHubTrigger("clean-station-kfi-v1", 
    Connection = "EventHubCleanConnectionString", 
    ConsumerGroup = "local-testing")] 
    Microsoft.Azure.EventHubs.EventData[] eventHubMessages)

因为EventData类型属于遗留包,触发器无法绑定。

如果可以,我们建议更新您的函数以使用 Azure.Messaging.EventHubs,因为 Microsoft.Azure.EventHubs 库已被正式弃用。 (ref)

如果您对 Microsoft.Azure.EventHubs 的现有投资使得迁移包变得困难,最直接的选择是使用 Microsoft.Azure.WebJobs.Extensions.EventHubs 包的 v4.3.1,它使用遗留库内部。

或者,您可以考虑在您的应用程序中同时使用 Azure.Messaging.EventHubsMicrosoft.Auzre.EventHubs,并在您的绑定中使用完整的命名空间来消除歧义 EventData;该场景的挑战在于,如果您直接在函数主体中使用事件中心客户端,则需要在旧版和当前 EventData 类型之间复制数据。

绑定更新类似于:

[EventHubTrigger("clean-station-kfi-v1", 
    Connection = "EventHubCleanConnectionString", 
    ConsumerGroup = "local-testing")] 
    Azure.Messaging.EventHubs.EventData[] events)