Azure 函数 QueueTrigger 和 int 消息

问题描述

我想将 int 值保存到队列消息中,然后在 Azure Function QueueTrigger 上获取它。

我通过以下方式保存:

        int deviceid = -1;
        await queue.AddMessageAsync(new CloudQueueMessage(deviceid.ToString()));

然后监听队列:

    public async Task Run(
        [QueueTrigger("verizon-suspend-device",Connection = "StorageConnectionString")] string queueMessage,ILogger log)
    {
        int deviceid = int.Parse(queueMessage);

但所有消息都被移动到 verizon-suspend-device-poison 队列。怎么了?

解决方法

不幸的是,Azure Function Queue Triggers currently require Base64-encoded messages 存在限制。如果您针对存储模拟器运行您的代码,您应该会从触发器中看到一个异常,例如 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.

至少现在(即,在触发器可以处理二进制/utf8 消息之前),排队代码必须将消息作为 Base64 字符串放在队列中。 string 消息的队列触发代码以 hereAsString assumes a Base64 encoding 结尾。

对于那个 (old) version of the storage SDK,您可以发送一个 Base64 编码的 UTF-8 字符串表示的整数:

var bytes = Encoding.UTF8.GetBytes(deviceId.ToString());
await queue.AddMessageAsync(new CloudQueueMessage(Convert.ToBase64String(bytes),isBase64Encoded: true));

使用 new storage SDK,您可以 set MessageEncoding on your QueueClient to QueueMessageEncoding.Base64 然后只发送整数的字符串表示(新的存储 SDK 将为您进行 UTF-8 编码,然后进行 Base64 编码)。