问题描述
我想将 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
消息的队列触发代码以 here 和 AsString
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 编码)。