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

Ram*_*ias 12 c# azure-queues .net-core azure-functions azure-triggers

我有这个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);

    }
Run Code Online (Sandbox Code Playgroud)

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

异常绑定参数 'myQueueItem' <--- 输入不是有效的 Base-64 字符串,因为它包含非 base-64 字符、两个以上的填充字符或填充字符中的非法字符。

I'm sending messages to the queue using this method from the Azure Queue library v.12 from Azure.Storage.Queues and found no overloads that encodes the message to Base-64. Note that _queue is a QueueClient instance.

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

So I tried to encode the message by myself...

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

      return await _queue.SendMessageAsync(msg);

 }
Run Code Online (Sandbox Code Playgroud)

... and it doesn't work either. Here's my code passing by that part but throwing error further on, indicating that it could get the message but it was not decoded correctly, since it was a filename of an existing blob in a storage:

解码错误

The only way to get this working is if I manually send a message to the queue using the Azure Storage Explorerchoosing for encode the message via UI.

小智 23

作为替代方案,您可以利用内置功能将消息转换为 Base64,方法是创建QueueClientOptions带有MessageEncoding设置为的客户端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.
Run Code Online (Sandbox Code Playgroud)


Joe*_*Cai 11

使用Azure.Storage.Queuesnuget 包并使用以下代码将字符串转换为 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);
}
Run Code Online (Sandbox Code Playgroud)

更多细节,你可以参考这个问题


Dan*_*zka 10

如果您使用的是 版本5.0.0或更高版本Microsoft.Azure.WebJobs.Extensions.Storage,您可以在 中设置消息编码host.json

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

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