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);
}
触发器正在正常激活,但这种奇怪的行为正在发生。该函数显然期望 message
在 Base-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.Queues
的 Azure 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 的内置功能,方法是创建具有 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.
如果您使用 5.0.0
或 Microsoft.Azure.WebJobs.Extensions.Storage
的更高版本,您可以在 host.json
:
中设置消息编码
{
"version": "2.0",
"extensions": {
"queues": {
"messageEncoding": "none"
}
}
}
我有这个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
.
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.Queues
的 Azure 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 的内置功能,方法是创建具有 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.
如果您使用 5.0.0
或 Microsoft.Azure.WebJobs.Extensions.Storage
的更高版本,您可以在 host.json
:
{
"version": "2.0",
"extensions": {
"queues": {
"messageEncoding": "none"
}
}
}