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

.NET 6 Web API测试byte[]类型接口报错,求配置指导

解决ASP.NET Core 6 Web API中byte[]请求体的Swagger测试问题

问题根源

  1. Newtonsoft默认BinaryConverter的限制:你使用的BinaryConverter默认仅支持Base64字符串的反序列化,无法直接解析你输入的二进制位字符串(如"11001101101101"),这是导致验证错误的核心原因。
  2. Swagger默认类型映射问题:Swagger对byte[]的默认显示为string,但未明确输入格式,容易造成误解。

解决方案

根据你的需求,分两种场景处理:

场景1:继续使用二进制位字符串作为输入

需要自定义Json转换器来处理二进制位字符串与byte[]的互转,并配置Swagger明确输入格式。

步骤1:自定义Json转换器

创建一个专门处理二进制位字符串的转换器:

public class BinaryStringToByteArrayConverter : JsonConverter<byte[]>
{
    public override byte[] ReadJson(JsonReader reader, Type objectType, byte[] existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        if (reader.Value is not string binaryString)
            throw new JsonSerializationException("输入必须是二进制位字符串");

        int byteCount = (binaryString.Length + 7) / 8;
        byte[] result = new byte[byteCount];

        for (int i = 0; i < binaryString.Length; i += 8)
        {
            string byteSegment = binaryString.Substring(i, Math.Min(8, binaryString.Length - i))
                                            .PadLeft(8, '0'); // 补前导零确保8位
            result[i / 8] = Convert.ToByte(byteSegment, 2);
        }

        return result;
    }

    public override void WriteJson(JsonWriter writer, byte[] value, JsonSerializer serializer)
    {
        // 序列化时将byte[]转为二进制位字符串
        writer.WriteValue(string.Concat(value.Select(b => Convert.ToString(b, 2).PadLeft(8, '0'))));
    }
}

步骤2:替换原有转换器

在服务注册中替换默认的BinaryConverter为自定义转换器:

services.AddControllers()
    .AddNewtonsoftJson(ser =>
    {
        ser.SerializerSettings.Converters.Add(new BinaryStringToByteArrayConverter());
    });

步骤3:配置Swagger明确输入格式

安装Swashbuckle的Newtonsoft支持包:

Install-Package Swashbuckle.AspNetCore.Newtonsoft

然后配置Swagger的类型映射:

builder.Services.AddSwaggerGen(c =>
{
    // 告诉Swagger byte[]对应二进制位字符串输入
    c.MapType<byte[]>(() => new OpenApiSchema
    {
        Type = "string",
        Description = "输入二进制位字符串(例如:\"11001101101101\")"
    });
});

// 启用NewtonsoftJson与Swagger的兼容支持
builder.Services.AddSwaggerGenNewtonsoftSupport();

场景2:改用Base64字符串输入(更通用的方案)

如果可以接受Base64格式输入,只需调整Swagger配置并使用原有BinaryConverter:

步骤1:保留原有BinaryConverter配置

无需修改转换器注册代码。

步骤2:配置Swagger说明Base64格式

builder.Services.AddSwaggerGen(c =>
{
    c.MapType<byte[]>(() => new OpenApiSchema
    {
        Type = "string",
        Format = "base64",
        Description = "输入Base64编码字符串(例如:\"MTIzNDU=\")"
    });
});

builder.Services.AddSwaggerGenNewtonsoftSupport();

测试时输入Base64字符串即可正常解析。

为什么.NET 4.8中正常?

.NET Framework 4.8的Web API默认序列化逻辑与ASP.NET Core不同,且当时的转换器配置与输入格式匹配,因此可以正常工作。

内容的提问来源于stack exchange,提问作者aliencoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:02:46