Проблема с максимальным размером полезной нагрузки CloudQueueMessage

Согласно MSDN, полезная нагрузка сообщения может достигать 8 КБ (8192 байта). ):

Метод AddMessage добавляет сообщение в конец очереди. Сообщение может иметь размер до 8 КБ. Его содержимое должно быть в формате, допускающем кодировку UTF-8.

Однако при добавлении сообщений в очередь я получаю исключения для сообщений, полезная нагрузка которых должна быть намного меньше 8192 байт, волшебная область, кажется, составляет около 6500 байт. Данные, которые я отправляю, представляют собой чистые строки, размер которых проверяется как от члена .Length, так и от длины, отправленной источником, из которого они извлекаются (существует постоянная разница в 2 байта для разделителя CRLF).

поэтому мой вопрос двоякий:

1) Есть ли какие-либо скрытые данные, добавленные к полезной нагрузке сообщения, которые увеличивают его размер или вызывают такое странное поведение? (например, ограничение применяется к объекту в целом, а не только к его полезной нагрузке, но даже в этом случае, как он может учитывать 1,5 КБ на сообщение?)

2) Как я могу надежно проверить, действительно ли полезная нагрузка ниже 8192?

и некоторая дополнительная информация: я использую Azure SDK 1.4 с VS 2010 Ultimate, запускаю эмуляторы вычислений и хранения (я еще не развернул это приложение) с помощью SQLExpress (я думаю, 2008 года).

Также с помощью кода подтверждено, что максимальный размер составляет 8192 байта (в случае какого-либо дополнительного системного ограничения):

Trace.WriteLine("Max Queue Message Size: " + CloudQueueMessage.MaxMessageSize, "CloudQueueMessage");

CloudQueueMessage: Максимальный размер сообщения в очереди: 8192


person Necrolis    schedule 06.07.2011    source источник


Ответы (1)


Клиентская библиотека хранилища .NET (Microsoft.WindowsAzure.StorageClient.dll) кодирует содержимое сообщений очереди в base-64, поэтому эффективное ограничение составляет 8192 * 0,75 = 6144 байт при использовании клиента .NET. библиотека. (Это потому, что кодирование base 64 добавляет 1/3 накладных расходов.)

(Обратите внимание, что вам не нужно нужно кодировать base 64. Просто так получилось, что эта библиотека гарантирует, что содержимое сообщения очереди может быть безопасно встроено в XML, что является требованием очереди. служебные места в сообщениях.)


РЕДАКТИРОВАТЬ: Вот пример кода для использования пространства имен Microsoft.WindowsAzure.StorageClient.Protocol для помещения необработанного текста (не в кодировке base 64) в сообщение очереди (и последующего его извлечения):

using System;
using System.Net;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
using Microsoft.WindowsAzure.StorageClient.Protocol;

class Program
{
    static void Main(string[] args)
    {
        var q = CloudStorageAccount.Parse("UseDevelopmentStorage=true").CreateCloudQueueClient().GetQueueReference("testqueue");
        q.CreateIfNotExist();

        var req = QueueRequest.PutMessage(new Uri(q.Uri, q.Name + "/messages"), 30, null);
        var body = QueueRequest.GenerateMessageRequestBody("hello world");
        req.ContentLength = body.Length;
        q.ServiceClient.Credentials.SignRequest(req);
        using (var stream = req.GetRequestStream())
        {
            stream.Write(body, 0, body.Length);
            stream.Close();
        }
        req.GetResponse();

        req = QueueRequest.GetMessages(new Uri(q.Uri, q.Name + "/messages"), 30, 32, null);
        q.ServiceClient.Credentials.SignRequest(req);
        using (var response = (HttpWebResponse)req.GetResponse())
        {
            using (var msgResponse = QueueResponse.GetMessages(response))
            {
                foreach (var msg in msgResponse.Messages)
                {
                    Console.WriteLine("MESSAGE: " + msg.Text);
                    q.DeleteMessage(msg.Id, msg.PopReceipt);
                }
            }
        }

        q.Delete();
    }
}
person user94559    schedule 06.07.2011
comment
Итак, как мне избежать кодировки base64? Нужно ли использовать другой метод построения библиотеки/сообщения? - person Necrolis; 06.07.2011
comment
Отредактировал мой ответ, включив в него образец. - person user94559; 07.07.2011