.NET 6 Web API测试byte[]类型接口报错,求配置指导
解决ASP.NET Core 6 Web API中byte[]请求体的Swagger测试问题
问题根源
- Newtonsoft默认BinaryConverter的限制:你使用的
BinaryConverter默认仅支持Base64字符串的反序列化,无法直接解析你输入的二进制位字符串(如"11001101101101"),这是导致验证错误的核心原因。 - 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
相关产品推荐
相关产品推荐

