2016-03-01 49 views
2

我想不断检查azure servicebus/iothub是否有消息。然而,当我不喜欢这样,我得到以下错误从Azure Servicebus/IotHub接收邮件

“类型‘Amqp.AmqpException’的异常出现在mscorlib.dll,但在用户代码中没有处理 附加信息:操作‘接收’不是在状态下有效:结束。“

任何想法,我应该如何实现不断拉消息和/或解决这个错误?

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 
} 
+0

你如何认证?在建立连接之后但在开启会话之前,您是否放置了CBS令牌?查看它:https://github.com/ppatierno/codesamples/blob/master/IoTHubAmqp/IoTHubAmqp/Program.cs – Helikaon

回答

0

从你使用它的端点看起来像你在谈论云接收到设备(C2D)消息,换句话说,你的设备上运行编写的代码,并旨在接收通过该服务发送到该设备的消息,对吗?

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

使用设备连接字符串创建实例后,类具有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); 
    } 
} 
+0

据我所知,官方的Nuget包只能在Windows上运行。他使用可在更多平台上运行的AMQP.Net lite – Helikaon

+0

现在也有Xamarin的Nuget软件包(PCL)。适用于Windows,iOS,Android,UWP和Windows Phone 8.AMQPNetlite的确支持更多的平台。 –

+0

是的,但据我所知,这些PCL只支持HTTP。 – Helikaon