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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:48:19