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

Azure functions 是否在Azure函数中访问ServiceBus.Messaging.EventData?,azure-functions,azure-iot-hub,Azure Functions,Azure Iot Hub,我想创建一个Azure函数,每当消息发送到Azure IoT集线器时都会触发该函数。在我编写的一个C#应用程序中,我创建了一个从中心提取消息的方法。在该方法中,我可以访问ServiceBus.Messaging.EventData对象,该对象包含有关消息的所有可用信息。方法如下所示: private static async Task ReceiveMessagesFromDeviceAsync(string partition, CancellationToken ct) {

我想创建一个Azure函数,每当消息发送到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);
        }
    }
public static void Run(string myIoTHubMessage, TraceWriter log)
{
    log.Info($"C# IoT Hub trigger function processed a message: {myIoTHubMessage}");
}
当我尝试在门户中创建基于C#的Azure函数时,创建的默认方法如下所示:

   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);
        }
    }
public static void Run(string myIoTHubMessage, TraceWriter log)
{
    log.Info($"C# IoT Hub trigger function processed a message: {myIoTHubMessage}");
}
我想知道是否有什么方法可以像在我的C#app中那样访问整个message对象,而不仅仅是消息本身(“MyIoTubMessage”)

注意:我尝试了以下功能,但是Azure函数不喜欢第一个使用引用。它找不到引用

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
,添加对包的引用,并对命名空间使用

#r“Microsoft.ServiceBus”
使用系统文本;
使用Microsoft.ServiceBus.Messaging;
公共静态无效运行(EventData MyEventThubMessage、TraceWriter日志)
{
log.Info($“{Encoding.UTF8.GetString(myEventHubMessage.GetBytes())}”);
}

是,只需将
字符串
替换为
事件数据
,添加对包的引用,并对命名空间使用

#r“Microsoft.ServiceBus”
使用系统文本;
使用Microsoft.ServiceBus.Messaging;
公共静态无效运行(EventData MyEventThubMessage、TraceWriter日志)
{
log.Info($“{Encoding.UTF8.GetString(myEventHubMessage.GetBytes())}”);
}

您可以按照以下步骤创建Azure函数,该函数在消息发送到Azure IoT集线器时启动

  • 使用Azure门户创建物联网中心,请参阅此
  • 创建功能应用程序,并为IoTHub添加功能,每当IoT Hub为与事件中心兼容的端点发送新消息时,都将运行此功能。
  • 按如下所示修改函数中的代码,保存并运行函数
  • 当您使用设备客户端向IoT Hub发送消息时,功能应用程序将启动,并显示在日志中。

    您可以按照以下步骤创建Azure函数,该函数在消息发送到Azure IoT集线器时启动

  • 使用Azure门户创建物联网中心,请参阅此
  • 创建功能应用程序,并为IoTHub添加功能,每当IoT Hub为与事件中心兼容的端点发送新消息时,都将运行此功能。
  • 按如下所示修改函数中的代码,保存并运行函数
  • 当您使用设备客户端向IoT Hub发送消息时,功能应用程序将启动,并显示在日志中。

    我确实试过了,但出现了一个错误,说找不到我的使用引用。这是我添加的:使用Microsoft.ServiceBus.Messaging@RandyMinder用完整的例子扩展了我的答案谢谢你Mikhail,但是这也不起作用,尽管我得到了一个不同的错误。错误为:[错误]Microsoft.Azure.WebJobs.Host:错误索引方法“Functions.MonitorIoTHub”。Microsoft.Azure.WebJobs.Host:无法将参数“MyEventThubMessage”绑定到类型EventData。确保绑定支持该参数类型。如果您正在使用绑定扩展(例如ServiceBus、Timers等),请确保已在启动代码(例如config.UseServiceBus()、config.UseTimers()等)中调用扩展的注册方法。@RandyMinder是否将IoT事件路由到事件中心或服务总线?您的函数具有哪种触发器类型?所有消息都流入IoT集线器,并且触发器是基于事件集线器创建的。我实际上尝试了该操作,但出现了一个错误,表明找不到我的使用引用。这是我添加的:使用Microsoft.ServiceBus.Messaging@RandyMinder用完整的例子扩展了我的答案谢谢你Mikhail,但是这也不起作用,尽管我得到了一个不同的错误。错误为:[错误]Microsoft.Azure.WebJobs.Host:错误索引方法“Functions.MonitorIoTHub”。Microsoft.Azure.WebJobs.Host:无法将参数“MyEventThubMessage”绑定到类型EventData。确保绑定支持该参数类型。如果您正在使用绑定扩展(例如ServiceBus、Timers等),请确保已在启动代码(例如config.UseServiceBus()、config.UseTimers()等)中调用扩展的注册方法。@RandyMinder是否将IoT事件路由到事件中心或服务总线?您的功能具有哪种触发器类型?所有消息都将流入IoT集线器,并且触发器是基于事件集线器创建的。谢谢。您能告诉我“#r”Microsoft.ServiceBus”是做什么的,以及为什么它对另一个using语句没有必要吗?@RandyMinder,
    “#r”Microsoft.ServiceBus“
    表示它需要添加外部程序集的引用。请看,谢谢。您能告诉我“#r”Microsoft.ServiceBus”是做什么的,以及为什么它对另一个using语句没有必要吗?@RandyMinder,
    “#r”Microsoft.ServiceBus“
    表示它需要添加外部程序集的引用。请看。