【问题标题】:Receive messages from Azure Servicebus / IotHub从 Azure Servicebus / IotHub 接收消息
【发布时间】:2016-03-01 10:13:16
【问题描述】:

我想经常检查 azure servicebus/iothub 是否有消息。但是,当我这样做时,会出现以下错误

"在 mscorlib.dll 中发生了 'Amqp.AmqpException' 类型的异常,但未在用户代码中处理 附加信息:“接收”操作在状态下无效:结束。”

任何想法我应该如何实现消息的持续拉取和/或解决此错误?

var connection = new Connection(address);
var session = new Session(connection);
var entity = Fx.Format("/devices/{0}/messages/deviceBound", _deviceId);

var receiveLink = new ReceiverLink(session, "receive-link", entity);
while (true)
{
    await Task.Delay(1000);

    var message = await receiveLink.ReceiveAsync();
    if (message == null) continue;
    //else do things with message
 }

【问题讨论】:

标签: c# azure azureservicebus azure-iot-hub azure-iot-sdk


【解决方案1】:

从您使用的端点看来,您正在谈论接收云到设备 (c2d) 消息,换句话说,您编写的代码在设备上运行,旨在接收消息通过服务发送到此设备,对吗?

最简单的方法是使用C# SDK 的DeviceClient 类。 DeviceClientAmqpSample 项目中提供了如何使用此类的示例。

使用设备连接字符串创建DeviceClient 实例后,DeviceClient 类具有可用于接收消息的ReceiveAsync 方法。

var deviceClient = DeviceClient.CreateFromConnectionString("<DeviceConnectionString>");
while(true)
{
    await Task.Delay(1000);
    var receivedMessage = await deviceClient.ReceiveAsync(TimeSpan.FromSeconds(1));
    if (receivedMessage != null)
    {
        var messageData = Encoding.ASCII.GetString(receivedMessage.GetBytes());
        Console.WriteLine("\t{0}> Received message: {1}", DateTime.Now.ToLocalTime(), messageData);
        await deviceClient.CompleteAsync(receivedMessage);
    }
}

【讨论】:

  • 据我所知,官方的 Nuget 包仅适用于 Windows。他使用在更多平台上运行的 AMQP.Net lite
  • 现在也有适用于 Xamarin 的 Nuget 包 (PCL)。适用于 Windows、iOS、Android、UWP 和 Windows Phone 8。AMQPNetlite 确实支持更多平台。
  • 是的,但据我所知,那些 PCL 只支持 HTTP。
  • Helikaon 是对的。单声道 (Raspberry) 不支持 Microsoft Azure 库。这就是我需要使用 AMQP.Net lite 的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多