Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 指定的消息不存在。错误代码:MessageNotFound产品工作错误上下文_C#_Asp.net_Asp.net Mvc 3_Azure_Queue - Fatal编程技术网

C# 指定的消息不存在。错误代码:MessageNotFound产品工作错误上下文

C# 指定的消息不存在。错误代码:MessageNotFound产品工作错误上下文,c#,asp.net,asp.net-mvc-3,azure,queue,C#,Asp.net,Asp.net Mvc 3,Azure,Queue,我有一个worker角色,它使用Azure队列中的消息,并在后台进行一些处理。 当我检查我的日志时,在处理消息时似乎没有记录异常,但在我的日志中仍然出现以下异常(仅粘贴长错误日志中的一些相关文本): System.Net.WebException Microsoft.WindowsAzure.Storage.StorageException消息: 远程服务器返回错误:(404)未找到。遥控器 服务器返回错误:(404)未找到。堆栈跟踪:在 System.Net.HttpWebRequest.Ge

我有一个worker角色,它使用Azure队列中的消息,并在后台进行一些处理。 当我检查我的日志时,在处理消息时似乎没有记录异常,但在我的日志中仍然出现以下异常(仅粘贴长错误日志中的一些相关文本):

System.Net.WebException Microsoft.WindowsAzure.Storage.StorageException消息: 远程服务器返回错误:(404)未找到。遥控器 服务器返回错误:(404)未找到。堆栈跟踪:在 System.Net.HttpWebRequest.GetResponse()位于 Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand
1
cmd,IRetryPolicy策略,OperationContext操作上下文)--下一步
调用堆栈:在
Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand
1 cmd、IRetryPolicy策略、OperationContext操作上下文)位于 Microsoft.WindowsAzure.Storage.Queue.CloudQueue.DeleteMessage(字符串 messageId、字符串PopReceive、QueueRequestOptions选项、, 操作上下文操作上下文)位于 InnovativeExams.Azure.CloudStorage.AzureQueue`1.DeleteMessage(T 消息)指定的消息不存在。 错误代码:MessageNotFound产品工作错误上下文

以下是我在worker角色中的代码:

private void ProcessQueueMessage(object queueMessageToProcess)
        {
            var queueMessage = queueMessageToProcess as EventCompletedQueueMessage;

            try
            {
                if (_eventCompletedProcessor.Process(queueMessage))
                    _azureQueue.DeleteMessage(queueMessage);
            }
            catch (Exception ex)
            {
                _logger.LogError(string.Format("Event Completed message <{0}> was not processed due to an exception", queueMessage.Id), ex, LogSources.WorkerRole_EventCompletedDispatcher);
            }
        }
private void ProcessQueueMessage(对象queueMessageToProcess)
{
var queueMessage=queuemessagetoprocessas EventCompletedQueueMessage;
尝试
{
if(_eventCompletedProcessor.Process(queueMessage))
_DeleteMessage(queueMessage);
}
捕获(例外情况除外)
{
_logger.LogError(string.Format(“由于异常而未处理事件完成消息”,queueMessage.Id),例如LogSources.WorkerRole\u EventCompletedDispatcher);
}
}
上述异常在上述catch块中捕获并记录

我认为当工作者角色尝试删除队列中的消息,但未找到消息时,会出现一些问题

需要某人的帮助来帮助我解决这个错误,并了解这里出了什么问题

评论中提出的几个问题:

1) 您是否正在运行工作人员角色的多个实例

答:这是一个现有的应用程序,我发现我们正在使用ThreadPool来预实例化线程,这些线程已经准备好接受工作

2) 你是如何“获取”你的工作者角色的信息的?您是否使用某种领导人选举模式来决定哪个实例获得消息

答:是的,有一个框架可以为要处理的QueueMessage确定适当的调度程序

3) 当您收到消息时,这些消息的可见性超时是多少

A:设定为120

4) 处理这些消息需要多长时间,即从获取消息到删除消息之间需要多长时间


答:我对此不确定。

让我解释一下,在什么情况下,您会遇到错误

当您将消息出列(即Azure术语中的
GET Messages
)时,Azure队列服务返回名为
popReceive
的内容,必须使用该内容删除或更新消息。此
popReceive
是一个不透明的值(即,您不应该围绕它构建任何业务逻辑),它在同一消息再次出列之前保持有效。当消息再次退出队列时,您将为
popReceive
获得一个新值,您应该使用此新值删除或更新消息

如果尝试使用旧的
popReceive
值删除消息,同时消息再次(通过其他进程)退出队列,则会出现错误

我猜这就是应用程序中发生的情况。请检查是否确实如此:


其中一个工作者角色实例将消息出列并开始处理该消息。根据以上所述,当您将消息出列时,您会将消息隐藏120秒。我假设处理消息的实际时间超过120秒,因此消息会重新出现在队列中。现在有另一个进程将此消息从队列中退出(因此您将获得一个新的
popReceive
)。然而,在第二个进程将消息出列后不久,第1个进程就完成了对消息的处理,现在它想使用它所拥有的
popreception
删除消息。由于此PopReceive不再有效,因此任何使用此PopReceive对该邮件执行删除操作的尝试都将导致“未找到邮件”错误。

让我解释一下在什么情况下会遇到错误

当您将消息出列(即Azure术语中的
GET Messages
)时,Azure队列服务返回名为
popReceive
的内容,必须使用该内容删除或更新消息。此
popReceive
是一个不透明的值(即,您不应该围绕它构建任何业务逻辑),它在同一消息再次出列之前保持有效。当消息再次退出队列时,您将为
popReceive
获得一个新值,您应该使用此新值删除或更新消息

如果尝试使用旧的
popReceive
值删除消息,同时消息再次(通过其他进程)退出队列,则会出现错误

我猜这就是应用程序中发生的情况。请检查是否确实如此:

其中一个工作者角色实例将消息出列并开始处理该消息。根据以上所述,当您将消息出列时,您会将消息隐藏120秒。我假设处理这些混乱的实际时间