Я унаследовал приложение 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 возвращает ошибку.
ОБНОВЛЕНИЕ (все еще не работает)
Я вынул заявление с закодированным сообщением, как ранее пытался добавить его, чтобы оно работало. Это все еще не работает. Я также показываю необработанную строку, недоступную из-за того, что это закрытый метод в классе:
Я вынул заявление с закодированным сообщением, как ранее пытался добавить его, чтобы оно работало. Это все еще не работает.
В ваш скриншот, мы могли бы найти, что вы просто удалите 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
Причина, по которой вы получаете эту ошибку, заключается в том, что вы инструктируете SDK для декодирования сообщения из строки, закодированной в base64, однако содержимое сообщения не кодируется в base64 (вы сохраняете сообщение в виде простого текста).
Пожалуйста, измените следующую строку кода:
queue.EncodeMessage = true;
в
queue.EncodeMessage = false;
И это должно решить проблему. От CloudQueue.EncodeMessage
документация:
Получает или задает значение, указывающее, применять ли кодировку base64 при
добавление или получение сообщений.