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

ASP.NET Web API 2 POST请求:查询字符串正常,StringContent传参报404

解决ASP.NET Web API 2 POST请求带体时404的问题

嘿,我帮你分析下这个常见问题——你遇到的情况核心大概率出在参数绑定规则或者请求头设置上,咱们一步步捋清楚:

首先排查Action方法签名

你说带查询参数?content=teststring时请求正常,说明你的Action大概率是这样定义的:

[HttpPost]
[Route("test")]
public HttpResponseMessage YourActionName(string content)
{
    // 你的处理逻辑
}

ASP.NET Web API默认会把string、int这类简单类型从URL查询字符串绑定,所以带?content=xxx的请求能精准命中这个Action。但当你用StringContent把数据放在请求体里时,Web API不知道要从请求体里取这个参数,就找不到匹配的Action,于是返回404。

解决方案:给参数加[FromBody]特性

修改你的Action,明确告诉Web API从请求体读取参数:

[HttpPost]
[Route("test")]
public HttpResponseMessage YourActionName([FromBody] string content)
{
    if (string.IsNullOrEmpty(content))
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest, "内容不能为空");
    }
    // 你的业务处理逻辑
    return Request.CreateResponse(HttpStatusCode.OK, $"收到内容:{content}");
}

然后检查StringContent的请求头设置

如果加了[FromBody]还是404,那大概率是你的StringContent没设置正确的Content-Type。Web API解析请求体时,需要匹配对应的媒体类型:

正确创建StringContent的两种方式

// 方式1:纯文本格式
var content = new StringContent("teststring", Encoding.UTF8, "text/plain");

// 方式2:JSON格式(更符合API规范,推荐)
var content = new StringContent("\"teststring\"", Encoding.UTF8, "application/json");
// 注意:JSON字符串必须用双引号包裹,否则Web API无法解析

额外排查:确认路由配置生效

检查你的WebApiConfig.cs里是否启用了属性路由——因为你用了[RoutePrefix]和[Route]特性,必须开启属性路由才能生效:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // 必须启用这行,属性路由才会生效
        config.MapHttpAttributeRoutes();

        // 可选:传统路由(如果需要兼容旧写法)
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

修改完后重启项目,用POST请求https://localhost:xxxx/api/test带上正确的StringContent和Content-Type,应该就能正常命中Action了。

内容的提问来源于stack exchange,提问作者Janilson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:22:33