我有一个 IoTHub,其地址为 route指向触发函数的 EventHub。
我在从事件对象获取 DeviceId 和其他 IoT 中心属性时遇到问题,而没有将它们显式添加到负载中。
如果我将输入类型设置为字符串
(或自定义类型):
public static void Run(string iotMessage, TraceWriter log) {
log.Info($"C# Event Hub trigger function processed a message: {iotMessage}");
}
我仅获取有效负载,而没有任何其他 IoT 中心属性,例如 DeviceId、CorrelationId 或 MessageId。
我尝试将类型设置为 EventData
:
public static void Run(EventData iotMessage, TraceWriter log) {
log.Info($"C# Event Hub trigger function processed a message: {JsonConvert.SerializeObject(iotMessage)}");
}
现在我可以通过两个 getter 访问 IoT 中心属性:Properties 和 SystemProperties。例如,我可以像这样 iotMessage.SystemProperties["iothub-connection-device-id"]
访问 DeviceId。但它不会暴露有效负载。
那么如何访问 IoT 中心属性和负载?
最佳答案
如果您除了负载之外还需要访问详细的事件属性,那么这是推荐的方法。在您不需要访问这些事件属性的情况下,string
等的简单/默认绑定(bind)非常有用。我们的运行时在幕后为您调用 EventData.GetBytes()
并将数据转换为您指定的输入类型。
不过,我确实认为我们可以做出改进来促进这些场景。我记录了一个错误 here在我们的存储库中跟踪这一点。
关于Azure IoT 中心、EventHub 和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42003600/