ASP.NET Core接口返回415 Unsupported Media Type,如何发送二进制原始数据?
修复ASP.NET Core API接收二进制原始数据的415 Unsupported Media Type错误
问题原因
带有[ApiController]特性的控制器默认仅启用JSON、XML等常见媒体类型的输入格式化器,不支持直接将application/octet-stream类型的请求体绑定到byte[]参数,即使添加[FromBody]也无法触发正确的解析逻辑,因此返回415错误。
解决方法
方法1:自定义输入格式化器(推荐,保持参数绑定风格)
创建支持application/octet-stream的输入格式化器,让框架能正确解析二进制请求体为byte[]:
public class OctetStreamInputFormatter : InputFormatter { public OctetStreamInputFormatter() { SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/octet-stream")); } public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context) { using var memoryStream = new MemoryStream(); await context.HttpContext.Request.Body.CopyToAsync(memoryStream); var bytes = memoryStream.ToArray(); return await InputFormatterResult.SuccessAsync(bytes); } protected override bool CanReadType(Type type) { return type == typeof(byte[]); } }
在Program.cs中注册该格式化器:
builder.Services.AddControllers(options => { // 插入到格式化器列表最前面,优先使用 options.InputFormatters.Insert(0, new OctetStreamInputFormatter()); });
修改控制器Action,保留[FromBody]标记:
[ApiController] [Route("[controller]")] public class TestController : Controller { [HttpPost] public IActionResult Action([FromBody] byte[] value) { var jsonString = Encoding.UTF8.GetString(value); var myObject = JsonSerializer.Deserialize<SampleObject>(jsonString); return Ok(myObject); } }
方法2:直接读取请求体(更简洁,无需额外格式化器)
跳过参数绑定,直接从HttpContext读取原始请求体数据:
[ApiController] [Route("[controller]")] public class TestController : Controller { [HttpPost] public async Task<IActionResult> Action() { using var memoryStream = new MemoryStream(); await Request.Body.CopyToAsync(memoryStream); var value = memoryStream.ToArray(); var jsonString = Encoding.UTF8.GetString(value); var myObject = JsonSerializer.Deserialize<SampleObject>(jsonString); return Ok(myObject); } }
客户端代码无需修改
保持原有的ByteArrayContent和application/octet-stream内容类型设置即可正常发送请求。
内容的提问来源于stack exchange,提问作者Jujjizzu
相关产品推荐
相关产品推荐

