c # — c ++ Azure Storage Queue отправляет неверный тип строки

Я унаследовал приложение C ++ (из которого я не эксперт, я парень .NET), которое отправляет сообщения в лазурную очередь в форме JSON. Это работает нормально, это когда я пытаюсь выбрать сообщение из очереди в моем консольном приложении .NET, которое дает мне следующее сообщение:

«Входные данные не являются допустимой строкой Base-64, поскольку они содержат неосновной 64-символ, более двух символов заполнения или непустой пробел среди символов заполнения».

Код C ++ выглядит следующим образом (обратите внимание на закомментированное фиктивное сообщение, которое дает пример того, как оно выглядит)

void send(utility::string_t msg) {

// Define the connection-string with your values.
const utility::string_t storage_connection_string(U("DefaultEndpointsProtocol=https;AccountName=bogus;AccountKey=YcG8FP9HdaB+r5jDTruTzZy8dXku+fLr4hvPcq+C6Uzhh7UOB6C7MemYluQMz28JlzwZIcn6Vw=="));
// Retrieve storage account from connection string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);
// Create a queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();
// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("beam-queue"));
// Create the queue if it doesn't already exist.
queue.create_if_not_exists();

// Create a message and add it to the queue.
//Dummy message
//azure::storage::cloud_queue_message message(U("[{\"url\":\"https://www.google.com.au\",\"app\":null,\"email\":\"[email protected]\",\"dbId\":\"323e3098-cc87-4b37-8eb5-85a6d6ddba1c\",\"seconds\":147.0490574,\"date\":\"2016-11-17T00:00:00+11:00\"}]"));
azure::storage::cloud_queue_message message(msg);
queue.add_message(message);

lastsendtime = GetTickCount();
}

Я даже могу увидеть сообщение в проводнике:

введите описание изображения здесь

Но похоже, что он не в том формате, как когда я выбираю сообщение из очереди:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(GetConnectionString());
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

CloudQueueClient clnt = storageAccount.CreateCloudQueueClient();
CloudQueue queue = clnt.GetQueueReference("bogus");
queue.EncodeMessage = true;

List<Service> userServices = null;

CloudQueueMessage retrievedMessage = queue.GetMessage();
List<CloudAppItem> items = JsonConvert.DeserializeObject<List<CloudAppItem>>(queue.GetMessage().AsString);

Это терпит неудачу в последней строке. И это не из-за сериализатора. Queue.GetMessage (). AsString возвращает ошибку.

введите описание изображения здесь

ОБНОВЛЕНИЕ (все еще не работает)

Я вынул заявление с закодированным сообщением, как ранее пытался добавить его, чтобы оно работало. Это все еще не работает. Я также показываю необработанную строку, недоступную из-за того, что это закрытый метод в классе:

введите описание изображения здесь

1

Решение

Я вынул заявление с закодированным сообщением, как ранее пытался добавить его, чтобы оно работало. Это все еще не работает.

В ваш скриншот, мы могли бы найти, что вы просто удалите queue.EncodeMessage = true;, но значение по умолчанию Свойство CloudQueue.EncodeMessage это правда, пожалуйста, явно установите CloudQueue.EncodeMessage на false.

CloudQueueClient clnt = storageAccount.CreateCloudQueueClient();
CloudQueue queue = clnt.GetQueueReference("bogus");
queue.EncodeMessage = false;  //explicitly set CloudQueue.EncodeMessage to false
2

Другие решения

Причина, по которой вы получаете эту ошибку, заключается в том, что вы инструктируете SDK для декодирования сообщения из строки, закодированной в base64, однако содержимое сообщения не кодируется в base64 (вы сохраняете сообщение в виде простого текста).

Пожалуйста, измените следующую строку кода:

queue.EncodeMessage = true;

в

queue.EncodeMessage = false;

И это должно решить проблему. От CloudQueue.EncodeMessage документация:

Получает или задает значение, указывающее, применять ли кодировку base64 при
добавление или получение сообщений.

1

По вопросам рекламы [email protected]