Azure队列触发器报错:输入不是有效的Base64字符串
问题:Azure队列触发器Base64解码错误排查与解决
使用Azure Queue Storage和Azure Functions队列触发器,通过C#控制台项目将Parameters类对象作为消息发送到Azure队列,再用队列触发器函数消费该对象时,持续报错:
Executed 'Function1' (Failed, Id=9134f8f9-0399-4049-a351-a5613b17aa12, Duration=35ms)[2023-06-10T07:38:48.866Z] System.Private.CoreLib: Execution while executing function: MyQueueFunction. Microsoft.Azure.WebJobs.Host: Exception binding parameter 'message'. System.Private.CoreLib: 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.
发送消息的控制台代码:
public class Parameters { public string? Usersid { get; set; } } class Program { static async Task Main(string[] args) { string connectionString = "<connectstring>"; string queueName = "<Queuename>"; QueueClientOptions options = new QueueClientOptions(); options.Diagnostics.IsLoggingEnabled = false; QueueClient queueClient = new QueueClient(connectionString, queueName, options); var message = new Parameters { Usersid = "Kth7", }; string jsonMessage = JsonConvert.SerializeObject(message); byte[] messageBytes = Encoding.UTF8.GetBytes(jsonMessage); string EncodedMessage = Convert.ToBase64String(messageBytes); try { await queueClient.SendMessageAsync(EncodedMessage); Console.WriteLine("Message sent"); } catch (Exception ex) { Console.WriteLine($"Failed to send the message. Error: {ex.Message}"); } } }
消费消息的Azure Function队列触发器代码:
public static class Function1 { [FunctionName("Function1")] public static async Task Run([QueueTrigger("<queuename>", Connection = "<constring>")]string message, ILogger log) { byte[] messageBytes = System.Convert.FromBase64String(message); string decodedMessage = Encoding.UTF8.GetString(messageBytes); Parameters classObject = JsonConvert.DeserializeObject<Parameters>(decodedMessage); log.LogInformation($"Received message: userid={classObject.Usersid}"); await Task.CompletedTask; } }
解决方案
1. 问题根源
Azure Queue Storage的SendMessageAsync(string)方法会自动对传入的字符串进行Base64编码。你手动对JSON字符串做了Base64编码,导致队列中存储的是双重Base64编码的内容,消费时解码自然会出现格式错误。
2. 修改发送端代码
去掉手动Base64编码的步骤,直接发送序列化后的JSON字符串:
public class Parameters { public string? Usersid { get; set; } } class Program { static async Task Main(string[] args) { string connectionString = "<connectstring>"; string queueName = "<Queuename>"; QueueClientOptions options = new QueueClientOptions(); options.Diagnostics.IsLoggingEnabled = false; QueueClient queueClient = new QueueClient(connectionString, queueName, options); var message = new Parameters { Usersid = "Kth7", }; // 仅序列化JSON,无需手动Base64编码 string jsonMessage = JsonConvert.SerializeObject(message); try { await queueClient.SendMessageAsync(jsonMessage); Console.WriteLine("Message sent"); } catch (Exception ex) { Console.WriteLine($"Failed to send the message. Error: {ex.Message}"); } } }
3. 修改消费端代码
方案一:去掉手动Base64解码步骤,直接反序列化JSON:
public static class Function1 { [FunctionName("Function1")] public static async Task Run([QueueTrigger("<queuename>", Connection = "<constring>")]string message, ILogger log) { // 触发器会自动完成Base64解码,直接反序列化即可 Parameters classObject = JsonConvert.DeserializeObject<Parameters>(message); log.LogInformation($"Received message: userid={classObject.Usersid}"); await Task.CompletedTask; } }
方案二:让触发器直接绑定到Parameters类型,进一步简化代码(需确保JSON结构匹配):
public static class Function1 { [FunctionName("Function1")] public static async Task Run([QueueTrigger("<queuename>", Connection = "<constring>")]Parameters message, ILogger log) { log.LogInformation($"Received message: userid={message.Usersid}"); await Task.CompletedTask; } }
内容的提问来源于stack exchange,提问作者ani H
相关产品推荐
相关产品推荐

