.NET Core 6.0调用MVC API提示Unsupported Media Type | 状态码415终极解决方案详解

大家好,我是第八哥。在做 .NET Core 6.0 项目时,我遇到过一个让人特别头疼的问题:前端调用 MVC API 接口时突然报 Unsupported Media Type,状态码 415。看似小问题,却可能卡你一整天。

今天我就以实战经验,系统地讲讲 .NET Core 6.0 的 415 错误原因、排查方法、完整解决方案,外加可复制的代码示例,让你一次彻底读懂。

一、为什么会出现415 Unsupported Media Type?

415表示服务器无法处理当前请求的 Content-Type。

换句话说:你发的请求格式,API 根本不认。

在 .NET Core 6.0 中,这种情况通常与:

  • • 请求头 Content-Type 设置不正确
  • • 控制器未启用相应格式绑定
  • • 模型绑定格式与发送数据不匹配
  • • JSON 反序列化要求更严格

都有关系。

二、最常见的错误请求示例(导致415)

假设你发了一个 POST 请求:


    
    
    
  fetch('/api/user', {
    method
: 'POST',
    body
: JSON.stringify({ name: 'Tom' })
});

表面没问题,但由于你没加 Content-Type,API 就会直接拒绝。

三、解决方案一:正确设置Content-Type

这是最常见、最简单的解决方式,也适用于前端、Postman、Axios、jQuery 等。


    
    
    
  fetch('/api/user', {
    method
: 'POST',
    headers
: {
        'Content-Type'
: 'application/json'
    },
    body
: JSON.stringify({ name: 'Tom' })
});

只要 API 的入参是 JSON,这个头必须带。

四、解决方案二:后端控制器必须接受JSON

你的 MVC API 方法必须长这样:


    
    
    
  [HttpPost]
public IActionResult AddUser([FromBody] UserDto dto)

{
    return
 Ok(new { msg = "success" });
}

如果你写成:


    
    
    
  public IActionResult AddUser(UserDto dto)

那默认不会从 body 读取数据,自然会报 415。

五、解决方案三:启用 JSON 解析(System.Text.Json 或 Newtonsoft)

.NET 6 默认用 System.Text.Json 来进行JSON解析,但字段区分大小写更严格,如果你传的字段不符合 C# 模型,会导致解析失败。

Program.cs 中加入:


    
    
    
  builder.Services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
});

如果项目中用 Newtonsoft,则直接写下面的内容即可:


    
    
    
  builder.Services.AddControllers().AddNewtonsoftJson();

六、解决方案四:multipart/form-data导致的415

如果你发送的是文件:


    
    
    
  Content-Type: multipart/form-data

那么方法不能用 [FromBody],必须用:


    
    
    
  public IActionResult Upload(IFormFile file)

否则仍然是 415。

七、解决方案五:使用Axios的正确写法


    
    
    
  axios.post('/api/user', {
    name
: 'Tom'
});

Axios 会自动加 Content-Type,不会出现 415。但如果你强制加错类型:


    
    
    
  { 'Content-Type': 'text/plain' }

那么后端也一样会报错。

八、解决方案六:跨域导致的415

如果你启用了 CORS,但没有允许 Content-Type:


    
    
    
  builder.Services.AddCors(options =>
{
    options.AddPolicy("default", policy =>
        policy.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin());
});

那么一定要允许自定义请求头,否则 OPTIONS 预检请求会失败,最终导致 415。

九、完整示例:最标准的可用配置(推荐复制)


    
    
    
  // Program.cs
builder.Services.AddControllers().AddJsonOptions(opt =>
{
    opt.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
});

builder.Services.AddCors(options =>
{
    options.AddPolicy("default", builder =>
                builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
});

var
 app = builder.Build();
app.UseCors("default");
app.MapControllers();
app.Run();

控制器:


    
    
    
  [ApiController]
[Route("api/[controller]")]
public
 class UserController : ControllerBase
{
    [HttpPost]
    public IActionResult Add([FromBody] UserDto dto)

    {
        return
 Ok(dto);
    }
}

前端 fetch:


    
    
    
  fetch('/api/user', {
    method
: 'POST',
    headers
: {
        'Content-Type'
: 'application/json'
    },
    body
: JSON.stringify({ name: 'Tom', age: 20 })
});

十、415错误完整排查清单(实战最有用)

遇到 415 时可以按这个顺序进行排查:

  1. 1. 是否忘记设置 Content-Type?
  2. 2. 入参是否正确标注 [FromBody]?
  3. 3. JSON 属性名是否大小写不一致?
  4. 4. 是否发送了不支持的 Content-Type(如 text/plain)?
  5. 5. 是否使用 form-data 却写了 [FromBody]?
  6. 6. CORS 是否允许自定义请求头?

按这个检查,大部分问题几分钟就能解决。

十一、总结

在 .NET Core 6.0 中出现 415 错误,本质都是:后端无法解析前端提交的请求格式

只要从 Content-Type、模型绑定、JSON 配置、CORS 四个方向排查,几乎都能快速定位。希望这篇文章能让你以后再遇到 415 时,不再迷茫。

上一篇 ExcelJS读取与写入实战指南 | 前端高效处理Excel的完整技巧 下一篇 返回列表

评论

暂不支持评论