大家好,我是第八哥。在做 .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. 是否忘记设置 Content-Type?
- 2. 入参是否正确标注 [FromBody]?
- 3. JSON 属性名是否大小写不一致?
- 4. 是否发送了不支持的 Content-Type(如 text/plain)?
- 5. 是否使用 form-data 却写了 [FromBody]?
- 6. CORS 是否允许自定义请求头?
按这个检查,大部分问题几分钟就能解决。
十一、总结
在 .NET Core 6.0 中出现 415 错误,本质都是:后端无法解析前端提交的请求格式。
只要从 Content-Type、模型绑定、JSON 配置、CORS 四个方向排查,几乎都能快速定位。希望这篇文章能让你以后再遇到 415 时,不再迷茫。
评论