最大CloudQueueMessage负载大小问题

本文关键字:问题 负载 CloudQueueMessage 最大 | 更新日期: 2023-09-27 18:01:13

根据MSDN,消息有效负载可能扩展到8KB(8192字节(:

AddMessage方法将消息添加到队列的后面。一条消息的大小可能高达8 KB。其内容必须采用可以使用UTF-8编码的格式。

然而,当将消息添加到队列中时,我会收到消息的异常,这些消息的有效负载应该小于8192字节,神奇的区域似乎在6500字节左右。我发送的数据是纯字符串,其大小通过.Length成员和从中检索数据的源发送的长度来验证(CRLF分隔符有恒定的2字节差异(。

所以我的问题有两个:

1( 是否有任何隐藏的数据附加到消息有效负载,会使其大小膨胀或导致这种奇怪的行为?(例如应用于整个对象的限制,而不仅仅是它的有效载荷,即使这样,它怎么能占每条消息1.5KB?(

2( 我如何可靠地检查有效载荷是否确实低于8192?

以及一些额外的信息:我正在使用带有VS 2010 Ultimate的Azure SDK 1.4,运行通过计算&存储模拟器(我还没有部署这个应用程序(使用SQLExpress(我认为是2008年(。

还通过代码确认,最大大小为8192字节(在一些额外的系统限制的情况下(:

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

CloudQueueMessage:最大队列消息大小:8192

最大CloudQueueMessage负载大小问题

。NET存储客户端库(Microsoft.WindowsAzure.StorageClient.dll(的base-64-encodes队列消息内容,因此使用时的有效限制为8192*.75=6144字节。NET客户端库。(这是因为基本64编码增加了1/3的开销。(

(请注意,没有以64为基础进行编码。这恰好是该库确保队列消息的内容可以安全地嵌入XML的方式,而XML正是队列服务对消息的要求。(


编辑:下面是使用Microsoft的示例代码。WindowsAzure。StorageClient。将原始文本(非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();
    }
}