【问题标题】:Value cannot be null. Parameter name: messageId值不能为空。参数名称:messageId
【发布时间】:2018-10-25 21:07:09
【问题描述】:

我正在尝试使用以下代码更新 Azure 队列的内容:

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

但是,我不断收到以下错误“值不能为空。参数名称:messageId”。 尝试通过互联网搜索,但找不到遇到此问题的人。

注意:我必须使用 Azure Queue。

【问题讨论】:

    标签: c# azure azure-queues azure-storage-queues


    【解决方案1】:

    更新:

    您可以将消息 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();
           }
    

    在您的情况下,假设您已经知道消息 id,那么您可以通过 id 更新您的消息。

    我们需要使用消息 id 迭代所有队列消息,以获取您要更新的正确消息。

    代码如下:

    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();
            }
    
        }
    }
    

    【讨论】:

    • 这个问题是,当我执行初始 GetMessage 时,我添加了一段时间的不可见超时,以避免其他程序从队列中访问该消息。因此,如果我再次获取,由于其上的锁定,我将不会检索与该 messageId 匹配的那个。
    • 在这种情况下,有两种方法:1.使用消息id和popReceipt。 2. 使用循环直到它可见。我已经用方法 1 更新了我的答案。
    • @AzureNewbie,如果它解决了您的问题,请帮助将其标记为答案。谢谢。
    • 您的解决方案非常有效。非常感谢@Ivan Yang
    【解决方案2】:

    要更新消息,您需要先获取特定消息,而不是创建新消息。

    更多详情Change the contents of a queued message

    【讨论】:

    • 如果您是 Microsoft 合作伙伴,我建议您访问 aka.ms/devchat 以获得有关 Azure 的个性化支持。它是免费的,而且是 24x5 的。
    • 有没有办法使用 messageId 来做到这一点?我的 API 已经做了一个 getMessage 并将消息发送到其他应用程序说 X。现在这个 X 想要更新消息的内容,所以它调用这个 API 来更新内容。在这种情况下,如果我执行 GetMessage,是否可以保证它会给我相同的消息?
    • @AzureNewbie 如果您不使用消息 ID,则不能保证它会给您相同的消息。你可以参考下面我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2014-05-17
    • 2016-05-14
    • 2015-11-05
    相关资源
    最近更新 更多