Azure 队列触发器功能立即将消息移动到有害队列

问题描述 投票:0回答:1

因此,我有一个非常基本的 Azure HTTP 函数,每当我对 url 发出 POST 请求时,它都会创建作业消息:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Azure.Storage.Queues;

namespace WeatherImageGenerator.HTTP
{
    public class StartJobFunction
    {

        private readonly ILogger<StartJobFunction> _logger;
        
        public StartJobFunction(ILogger<StartJobFunction> logger)
        {
            _logger = logger;
        }

        [Function("StartJobFunction")]
        public async Task<IActionResult> Run (
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req)
            {
                _logger.LogInformation("Received request to start a job.");

                var jobId = Guid.NewGuid().ToString();

                var message = JsonConvert.SerializeObject(new { JobId = jobId, Status = "Pending"});

                string connectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage");
                QueueClient queueClient = new QueueClient(connectionString, "startjobqueue");

                await queueClient.CreateIfNotExistsAsync();

                await queueClient.SendMessageAsync(message);

                _logger.LogInformation($"Sent message to start job queue for job {jobId}");

                return new OkObjectResult(new { JobId = jobId });
            }
    }
}

但是,当我将 Azure 队列触发器添加到此队列时(即使使用 VSCode 中生成的代码),所有消息都会立即达到 MaxDequeueCount 5 并被发送到有害队列。我该如何解决这个问题?

作为参考,这里是生成的 Azure 队列触发器函数:

using System;
using Azure.Storage.Queues.Models;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace WeatherImageGenerator.Queue
{
    public class ProcessStartJobQueue
    {
        private readonly ILogger<ProcessStartJobQueue> _logger;

        public ProcessStartJobQueue(ILogger<ProcessStartJobQueue> logger)
        {
            _logger = logger;
        }

        [Function(nameof(ProcessStartJobQueue))]
        public void Run([QueueTrigger("startjobqueue", Connection = "AzureWebJobsStorage")] QueueMessage message)
        {
            _logger.LogInformation($"C# Queue trigger function started for message: {message.MessageText}");
        }
    }
}

它甚至不显示队列记录器信息,只是立即将消息发送到中毒队列。

c# azure azure-functions message-queue
1个回答
0
投票

您的问题与您的消息编码有关。

旧版本的

queueClient
用于自动执行编码,但这不再是此处文档中的默认行为。

因此,您需要在发送字符串之前对其进行 Base64 编码。

您可以使用以下方法来做到这一点:

var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(message); var encodedMessage = System.Convert.ToBase64String(plainTextBytes);
然后发送 

encodedMessage

 字符串而不是原始 
message
 字符串。

我建议创建一个静态辅助方法来更轻松地处理这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.