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
相关产品推荐
相关产品推荐

