因此,我有一个非常基本的 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}");
}
}
}
它甚至不显示队列记录器信息,只是立即将消息发送到中毒队列。
您的问题与您的消息编码有关。
旧版本的
queueClient
用于自动执行编码,但这不再是此处文档中的默认行为。
因此,您需要在发送字符串之前对其进行 Base64 编码。您可以使用以下方法来做到这一点:
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(message);
var encodedMessage = System.Convert.ToBase64String(plainTextBytes);
然后发送 encodedMessage
字符串而不是原始
message
字符串。我建议创建一个静态辅助方法来更轻松地处理这个问题。