添加[FromBody]特性导致ASP.NET Core接口返回404错误
解决ASP.NET Core添加[FromBody]后Action返回404的问题
听起来你踩了ASP.NET Core路由匹配和模型绑定的坑,我来帮你一步步梳理问题和解决方案:
首先得明确:404错误本质是请求的URL/HTTP方法和Action的路由配置不匹配,和模型绑定失败(通常返回400 Bad Request)是两码事,所以先从路由排查起:
第一步:排查路由与请求的匹配性
- 核对Action和控制器的路由特性:
比如如果控制器上标注了[Route("api/[controller]")],Action是[HttpPost("my-action")],那你的Ajax请求URL必须是/api/你的控制器名/my-action,且请求方法必须是POST。 - 用浏览器开发者工具(F12)确认请求细节:
检查请求的URL完全正确、HTTP方法是POST(如果Action标记了[HttpPost]),没有拼写错误或路径层级问题。
第二步:修正[FromBody]的简单类型绑定逻辑
你提到的在值前加=前缀,是旧版ASP.NET WebApi的绑定逻辑,ASP.NET Core的处理方式已经不同了,这里给你两种可行方案:
推荐方案:用JSON格式发送数据(最省心)
ASP.NET Core默认内置了JSON输入格式化器,只要发送标准JSON字符串,[FromBody] string就能完美绑定,不需要额外配置:
- 调整Ajax代码:
$.ajax({ url: '/api/YourController/YourAction', // 替换为你的实际路由 type: 'POST', contentType: 'application/json', // 必须设置这个 data: JSON.stringify("你的字符串内容"), // 转成JSON格式的字符串 success: function(response) { // 处理返回结果 }, error: function(xhr) { console.log(xhr.statusText); } }); - Action保持不变:
[HttpPost] public IActionResult YourAction([FromBody] string input) { // 业务逻辑 return Ok(input); }
备选方案:支持text/plain类型的绑定
如果你一定要用text/plain类型发送数据,需要给ASP.NET Core添加对应的输入格式化器(默认没有内置):
- 定义自定义格式化器类:
public class TextPlainInputFormatter : TextInputFormatter { public TextPlainInputFormatter() { SupportedMediaTypes.Add("text/plain"); SupportedEncodings.Add(Encoding.UTF8); SupportedEncodings.Add(Encoding.Unicode); } protected override bool CanReadType(Type type) { // 仅支持绑定string类型 return type == typeof(string); } public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding) { using var reader = new StreamReader(context.HttpContext.Request.Body, encoding); var content = await reader.ReadToEndAsync(); return await InputFormatterResult.SuccessAsync(content); } } - 在Program.cs中注册这个格式化器:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(options => { // 将自定义格式化器放在最前面,优先匹配 options.InputFormatters.Insert(0, new TextPlainInputFormatter()); }); // 其他配置代码... var app = builder.Build(); // 中间件配置... app.MapControllers(); app.Run(); - 调整Ajax代码(无需加
=前缀):$.ajax({ url: '/api/YourController/YourAction', type: 'POST', contentType: 'text/plain', data: "你的字符串内容", // 直接传字符串即可 success: function(response) { // 处理结果 } });
为什么加=前缀没用?
那个=前缀是旧版ASP.NET WebApi中,针对application/x-www-form-urlencoded类型绑定简单参数的特殊写法,但ASP.NET Core中,[FromBody]会强制从请求体绑定,而默认的application/x-www-form-urlencoded格式化器不会处理这种单参数格式,只会导致绑定失败(此时应该返回400而非404)——所以你的核心问题还是路由或HTTP方法不匹配,先把这个排查清楚,再调整绑定逻辑。
内容的提问来源于stack exchange,提问作者Valuator
相关产品推荐
相关产品推荐

