简体   繁体   English

值不能为空。 参数名称:messageId

[英]Value cannot be null. Parameter name: messageId

I'm trying to update the content of an Azure Queue using the following code : 我正在尝试使用以下代码更新Azure队列的内容:

queue.UpdateMessage(new CloudQueueMessage(timestamp + "|" + encodedContent),TimeSpan.FromMinutes(0),MessageUpdateFields.Content, null, null);

However, I keep getting the following error "Value cannot be null. Parameter name: messageId". 但是,我不断收到以下错误“值不能为空。参数名称:messageId”。 Tried searching through the internet but couldn't find anyone having this issue. 尝试通过互联网进行搜索,但找不到任何人遇到此问题。

Note: It's mandatory for me to use Azure Queue. 注意:我必须使用Azure Queue。

To update a message, you need to get the specific message first instead of creating a new message. 要更新消息,您需要先获取特定消息,而不是创建新消息。

For more details Change the contents of a queued message 有关更多详细信息,请更改排队消息的内容

Update: 更新:

You can pass message id and PopReceipt to your method: 您可以将消息ID和PopReceipt传递给您的方法:

        static void Main(string[] args)
        {

           CloudStorageAccount storageAccount = CloudStorageAccount.Parse(                
                     CloudConfigurationManager.GetSetting("StorageConnectionString"));

           // Create the queue client.
           CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

           // Retrieve a reference to a container.
           CloudQueue queue = queueClient.GetQueueReference("myqueue0905");

           //Retrieve the cached approximate message count.
           queue.FetchAttributes();
           int? cachedMessageCount = queue.ApproximateMessageCount;

           //get the message id and PopReceipt, or you can pass them from your api call.
           string _id = "";
           string _popreceipt = "";

           if (cachedMessageCount != null)
           {

            foreach (CloudQueueMessage message in queue.GetMessages(cachedMessageCount.Value, TimeSpan.FromMinutes(3)))
            {
                 _id = message.Id;
                 _popreceipt = message.PopReceipt;

                 Console.WriteLine("the id is:" + _id);
                 Console.WriteLine("the pop receipt is:" + _popreceipt);

             }

            }

          //update queue message by using message id and PopReceipt
          var msg = new CloudQueueMessage(_id, _popreceipt);
          msg.SetMessageContent("a test messge 123456");
          queue.UpdateMessage(msg, TimeSpan.FromSeconds(120.0),
                            MessageUpdateFields.Content | MessageUpdateFields.Visibility);            

          Console.WriteLine("complete update");
          Console.ReadLine();
       }

In your case, assume you already know the message id, then you can update your message via the id. 对于您的情况,假设您已经知道消息ID,则可以通过ID更新消息。

We need to iterate all the queue messages using the message id, to fetch the correct message you want to update. 我们需要使用消息ID遍历所有队列消息,以获取要更新的正确消息。

Code like below: 如下代码:

using Microsoft.Azure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Queue;
using System;

namespace ConsoleApp11
{
    class Program
    {
        static void Main(string[] args)
        {
            //assume you know the message id
            string message_id = "3798f6b6-1541-4421-b8de-79a8294edf49";

            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

            // Create the queue client.
            CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

            // Retrieve a reference to a container.
            CloudQueue queue = queueClient.GetQueueReference("myqueue0905");

            //Retrieve the cached approximate message count.
            queue.FetchAttributes();
            int? cachedMessageCount = queue.ApproximateMessageCount;

            //if the queue is not null
            if (cachedMessageCount != null)
            {

                foreach (CloudQueueMessage message in queue.GetMessages(cachedMessageCount.Value))
                {
                    if (message.Id == message_id)
                    {
                        message.SetMessageContent("test updated content again");
                        queue.UpdateMessage(message, TimeSpan.FromSeconds(5.0),
                            MessageUpdateFields.Content | MessageUpdateFields.Visibility);
                    }
                }

            }

            Console.ReadLine();
        }

    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM