26

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

    }

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

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

我正在使用Azure Queue库 v.12中的此方法将消息发送到队列,但Azure.Storage.Queues没有发现将消息编码为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 对消息进行编码,手动将消息发送到队列。

4

4 回答 4

40

作为替代方案,您可以利用内置功能将消息转换为 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.
于 2020-11-25T07:54:48.167 回答
12

使用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);
}

有关更多详细信息,您可以参考此问题

于 2020-07-22T05:41:53.683 回答
2

如果您使用的版本5.0.0或更高版本Microsoft.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

于 2021-11-10T16:26:17.990 回答
0

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

于 2020-07-22T04:44:48.607 回答