错误:消息已达到 MaxDequeueCount 5。将消息移至队列“webjobs-blobtrigger-poison”

Moh*_*tri 9 c# azure-functions azure-blob-trigger

错误:消息已达到 MaxDequeueCount 5。将消息移至队列“webjobs-blobtrigger-poison”。当我尝试将新文件放入 Azure 的容器中时,出现 5 次操作失败,并显示以下消息:消息已达到 MaxDequeueCount 为 5。正在将消息移至队列“webjobs-blobtrigger-poison”。

这是我的代码:

using System;
using System.IO;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Xml;
using System.Threading.Tasks;

namespace dynamicFileRepository
{
    [StorageAccount("BlobConnectionString")]
    public class copyBlobtoazureStorage
    {
       
        [FunctionName("copyBlobtoazureStorage")]
        public void Run(
            [BlobTrigger("input-file/{name}")] Stream inputBlob,
            [Blob("output-file/{name}", FileAccess.Write)] Stream outputBlob,
            string name, ILogger log, ExecutionContext context)
        {

            XmlDocument doc = new XmlDocument();
            using (XmlReader reader = XmlReader.Create(inputBlob))
            {
                doc.Load(reader);
            }
            string jsonText = JsonConvert.SerializeXmlNode(doc);
            Console.WriteLine(jsonText);

            log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {inputBlob.Length} Bytes");
        

       
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出窗口:

在此输入图像描述

Luk*_*gan 17

我已经遇到过这个问题好几次了,两次的原因都是因为我没有对要添加到队列中的有效负载进行 Base64 编码。

var queueClient = new QueueClient(connectionString, "my-queue");
var bytes = Encoding.UTF8.GetBytes(message);
await queueClient.SendMessageAsync(Convert.ToBase64String(bytes));
Run Code Online (Sandbox Code Playgroud)

令人沮丧的是,错误消息并没有更具启发性。事实上,有人向 Azure 团队提出了这个问题

  • 太感谢了。只是无法弄清楚出了什么问题。 (2认同)

Fah*_*qri 7

我最近也遇到这个问题。我有一个 Blazor 应用程序,它将消息排队到 Azure 队列,并使用第二个 Azure Functions 来出列并处理它,但不知何故,Azure Functions 不想处理该消息,并且该消息最终进入有害队列。

Azure.Storage.Queue事实证明,消息编码(默认为None)与 WebJobs 中使用的消息编码(Function App 默认为Base64 )不同。解决方案是确保两个应用程序使用相同的编码。

在您的 host.json 文件中,添加以下代码:

{
  "version": "2.0",
  "extensions": {
    "queues": {
      "messageEncoding": "base64" // or "none"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在您想要发布消息的其他应用程序中,通过设置适当的编码QueueClientOptions

var client = new QueueClient("ConnectionString", "QueueName", new QueueClientOptions
{
    MessageEncoding = QueueMessageEncoding.Base64 // or QueueMessageEncoding.None
});
Run Code Online (Sandbox Code Playgroud)

另外,当您向队列添加新消息时,不要忘记Encode the message body in Base64 encoding根据是否要使用 Base64 勾选 。

在此输入图像描述