Azure Functions:队列触发器需要 Base-64 消息,但未正确处理它们

Azure Functions: Queue Trigger is expecting Base-64 messages and doesn't process them correctly

我有这个Queue Trigger。预期是当我在 Queue 中插入一条消息时,触发器必须触发并处理出列的消息。

    [FunctionName("NewPayrollQueueTrigger")]
    public async static void Run([QueueTrigger("myqueue", Connection = 
    "AzureWebJobsStorage")]string myQueueItem,
        [DurableClient] IDurableOrchestrationClient starter,
        ILogger log)
    {
        log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

        await starter.StartNewAsync("NewPayrollOrchestrator", input: myQueueItem);

    }

触发器正在正常激活,但这种奇怪的行为正在发生。该函数显然期望 messageBase-64.

中编码

Exception binding parameter 'myQueueItem' <--- The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.

我正在使用来自 Azure.Storage.QueuesAzure Queue 库 v.12 中的此方法将消息发送到队列,但没有发现将消息编码为 Base-64 的重载。 请注意,_queue 是一个 QueueClient 实例。

 public async Task<Response<SendReceipt>> SendAsync(string message)
 {
        return await _queue.SendMessageAsync(message);
 }

所以我尝试自己对消息进行编码...

 public async Task<Response<SendReceipt>> SendAsBase64Async(string message)
 {
      byte[] buffer = Encoding.Unicode.GetBytes(message);
      string msg = Convert.ToBase64String(buffer);

      return await _queue.SendMessageAsync(msg);

 }

...而且它也不起作用。这是我的代码经过该部分但进一步抛出错误,表明它可以获取消息但未正确解码,因为它是存储中现有 blob 的文件名:

实现此功能的唯一方法是,如果我使用 Azure Storage Explorer 选择通过 UI.

对消息进行编码,手动将消息发送到队列

您正在使用旧的 nuget 包版本。升级到 Azure.Storage.Queue,它应该会按预期工作

使用Azure.Storage.Queues nuget 包并使用以下代码将字符串转换为Base 64 编码。您需要使用 Encoding.UTF8.GetBytes (plainText).

进行编码
await queueClient.SendMessageAsync(Base64Encode(serializedCommand), cancellationToken);

private static string Base64Encode(string plainText)
{
    var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
    return System.Convert.ToBase64String(plainTextBytes);
}

更多的细节,你可以参考这篇issue

作为替代方案,您可以利用将消息转换为 Base64 的内置功能,方法是创建具有 QueueClientOptionsMessageEncoding 设置为 QueueMessageEncoding.Base64 的客户端。

例如:

_queue = new QueueClient(connectionString, queueName, new QueueClientOptions
{
    MessageEncoding = QueueMessageEncoding.Base64
});

...

var message = "some message";
await _queue.SendMessageAsync(message); // Will be converted as Base64.

如果您使用 5.0.0Microsoft.Azure.WebJobs.Extensions.Storage 的更高版本,您可以在 host.json:

中设置消息编码
{
    "version": "2.0",
    "extensions": {
        "queues": {
            "messageEncoding": "none"
        }
    }
}

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue#hostjson-settings