Получение сообщений от 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
 }

person discy    schedule 01.03.2016    source источник
comment
Как вы аутентифицируетесь? Ставите ли вы токен CBS после установления соединения, но до открытия сеанса? Проверьте это: github.com/ppatierno/codesamples/blob/ мастер/IoTHubAmqp/   -  person Helikaon    schedule 08.04.2016


Ответы (1)


С конечной точки, которую вы используете, похоже, что вы говорите о получении сообщений от облака к устройству (c2d), другими словами, код, который вы пишете, выполняется на устройстве и предназначен для получения сообщений, отправленных через обслуживать это устройство, верно?

Самый простой способ сделать это — использовать DeviceClient класса C# SDK. Пример использования этого класса приведен в 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);
    }
}
person pierreca - MSFT    schedule 07.04.2016
comment
Насколько я знаю, официальный пакет Nuget работает только в Windows. Он использует AMQP.Net lite, который работает на большем количестве платформ. - person Helikaon; 08.04.2016
comment
Теперь также есть пакеты Nuget для Xamarin (PCL). Работает на Windows, iOS, Android, UWP и Windows Phone 8. AMQPNetlite действительно поддерживает еще больше платформ. - person pierreca - MSFT; 08.04.2016
comment
Да, но насколько мне известно, эти PCL поддерживают только HTTP. - person Helikaon; 08.04.2016
comment
Геликаон прав. Библиотеки Microsoft Azure не поддерживаются в моно (Raspberry). Вот почему мне нужно использовать AMQP.Net lite. - person discy; 09.04.2016