2017-02-07 1 views
1

Я унаследовал приложение C++ (из которого Im no expert, Im an .NET guy), который отправляет сообщения в лазурную очередь в форме JSON. Это прекрасно работает, когда я пытаюсь выбрать сообщение из очереди в своем консольном приложении .NET, которое дает мне следующее сообщение:C++ Azure Storage Queue отправляет неверный тип строки

«Вход не является допустимой строкой 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(); 
} 

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

enter image description here

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

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 возвращает ошибку.

enter image description here

UPDATE (До сих пор не работает)

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

enter image description here

ответ

2

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

В your screenshot, мы могли бы найти, что вы просто удалить queue.EncodeMessage = true;, но значение по умолчанию CloudQueue.EncodeMessage property верно, пожалуйста, явно установить CloudQueue.EncodeMessage ложь.

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

Кажется работать. Спасибо. Я не знаю, почему я этого не сделал! – user1112324

1

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

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

queue.EncodeMessage = true; 

к

queue.EncodeMessage = false; 

И что должны заботиться о проблеме. Из CloudQueue.EncodeMessage документации:

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

+0

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

Смежные вопросы