在 Azure 函数中访问 ServiceBus.Messaging.EventData?

Access To ServiceBus.Messaging.EventData in an Azure Function?

我想创建一个 Azure Functions,只要有消息发送到 Azure IoT 中心就会触发。在我编写的 C# 应用程序中,我创建了一个从集线器中提取消息的方法。在该方法中,我可以访问包含有关消息的所有可用信息的 ServiceBus.Messaging.EventData 对象。该方法如下所示:

   private static async Task ReceiveMessagesFromDeviceAsync(string partition, CancellationToken ct)
    {
        var eventHubReceiver = eventHubClient.GetDefaultConsumerGroup().CreateReceiver(partition, System.DateTime.UtcNow);

        while (true)
        {
            if (ct.IsCancellationRequested)
                break;

            EventData eventData = await eventHubReceiver.ReceiveAsync();
            if (eventData == null)
                continue;

            // Get the Device Id which is included in the SystemProperties dictionary
            string deviceId = eventData.SystemProperties["iothub-connection-device-id"].ToString();

            string data = Encoding.UTF8.GetString(eventData.GetBytes());
            Console.WriteLine("Message received - DeviceId: {0}; Partition: {1}; Data: '{2}'", deviceId, partition, data);
        }
    }

当我尝试在门户中创建基于 C# 的 Azure 函数时,创建的默认方法如下所示:

public static void Run(string myIoTHubMessage, TraceWriter log)
{
    log.Info($"C# IoT Hub trigger function processed a message: {myIoTHubMessage}");
}

我想知道是否可以通过某种方式访问​​整个消息对象,就像在我的 C# 应用程序中一样,而不是仅仅访问消息本身 ('myIotHubMessage')?

注意:我尝试了以下方法,但 Azure Functions 不喜欢第一个 using 参考。找不到引用。

using Microsoft.ServiceBus.Messaging;
using System.Text;

public static void Run(EventData eventData, TraceWriter log)
{
    var data = Encoding.UTF8.GetString(eventData.GetBytes());

    log.Info($"C# IoT Hub trigger function processed a message: {data}");
}

是的,只需将 string 替换为 EventData,添加对包的引用和对命名空间的 using

#r "Microsoft.ServiceBus"
using System.Text;
using Microsoft.ServiceBus.Messaging;

public static void Run(EventData myEventHubMessage, TraceWriter log)
{
    log.Info($"{Encoding.UTF8.GetString(myEventHubMessage.GetBytes())}");
}

您可以按照后续步骤创建一个 Azure 函数,只要有消息发送到 Azure IoT 中心就会触发该函数。

  1. 使用 Azure 门户创建物联网中心,请参考此article
  2. 创建功能应用程序,并为 IoTHub 添加一个功能,每当 IoT 中心为事件 Hub-compatible 端点发送新消息时,此功能将 运行。
  3. 修改函数中的代码如下,保存并运行函数。
#r "Microsoft.ServiceBus"
using System.Text;
using Microsoft.ServiceBus.Messaging;

public static void Run(EventData myIoTHubMessage, TraceWriter log)
{
    log.Info($"{Encoding.UTF8.GetString(myIoTHubMessage.GetBytes())}");
}

当您使用设备客户端向 IoT 中心发送消息时,函数应用程序将触发,它将显示在日志中。