Azure functions 是否在Azure函数中访问ServiceBus.Messaging.EventData?
我想创建一个Azure函数,每当消息发送到Azure IoT集线器时都会触发该函数。在我编写的一个C#应用程序中,我创建了一个从中心提取消息的方法。在该方法中,我可以访问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) {
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“
表示它需要添加外部程序集的引用。请看。