You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:08:24