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

添加[FromBody]特性导致ASP.NET Core接口返回404错误

解决ASP.NET Core添加[FromBody]后Action返回404的问题

听起来你踩了ASP.NET Core路由匹配和模型绑定的坑,我来帮你一步步梳理问题和解决方案:

首先得明确:404错误本质是请求的URL/HTTP方法和Action的路由配置不匹配,和模型绑定失败(通常返回400 Bad Request)是两码事,所以先从路由排查起:


第一步:排查路由与请求的匹配性

  1. 核对Action和控制器的路由特性:
    比如如果控制器上标注了[Route("api/[controller]")],Action是[HttpPost("my-action")],那你的Ajax请求URL必须是/api/你的控制器名/my-action,且请求方法必须是POST。
  2. 用浏览器开发者工具(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添加对应的输入格式化器(默认没有内置):

  1. 定义自定义格式化器类:
    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);
        }
    }
    
  2. 在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();
    
  3. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:21:30