如何在Azure函数中通过Event Hub获取IoT Hub事件类型并解决转换异常
解决IoT Hub事件通过Event Hub触发Azure函数的参数转换异常问题
问题背景
现有IoT Hub,选择Event Hub(相比Event Grid成本更低)传输设备连接/生命周期事件到Azure函数应用:
- 依赖
Microsoft.Azure.EventHubs.EventData的非隔离C#6函数可正常接收事件 - 基于
Azure.Messaging.EventHubs.EventData的隔离模式C#7函数触发时出现输入参数转换异常 - 新建.NET6 LTS非隔离项目可解决问题,但直接升级现有项目后异常仍存在
问题根源
- 新旧Event Hubs SDK API不兼容:
Microsoft.Azure.EventHubs.EventData属于老一代SDK,Azure.Messaging.EventHubs.EventData是Azure SDK for .NET重写后的新版本,两者结构差异较大 - 隔离模式C#7函数与新版Event Hubs SDK的参数绑定存在适配缺陷,且直接升级项目时易残留老版本依赖、配置冲突,导致参数转换失败
解决方案
方案1:新建.NET6 LTS非隔离项目(已验证生效)
直接创建TargetFramework为net6.0的非隔离模式C#函数项目,使用Azure.Messaging.EventHubs.EventData作为触发器输入参数,配置Event Hub触发器即可正常接收IoT Hub转发的事件。
方案2:修复现有升级项目
若需保留现有项目,按以下步骤操作:
- 卸载所有旧版Event Hubs相关NuGet包:
Microsoft.Azure.EventHubs、老版本Microsoft.Azure.WebJobs.Extensions.EventHubs - 安装适配.NET6+的最新版
Microsoft.Azure.WebJobs.Extensions.EventHubs和Azure.Messaging.EventHubs - 修改函数输入参数类型为
Azure.Messaging.EventHubs.EventData,确保触发器配置正确 - 编辑项目文件(.csproj),确认配置:
<TargetFramework>net6.0</TargetFramework> <IsIsolated>false</IsIsolated> - 删除bin/obj目录清理缓存,重新构建项目
内容的提问来源于stack exchange,提问作者user2986756
相关产品推荐
相关产品推荐

