Web API调用遇404错误:找不到匹配'get'的控制器及请求资源
修复Web API GET请求的404错误
我来帮你分析并解决这两个404问题,核心原因是路由配置不匹配和GET请求的参数绑定错误:
错误原因拆解
- 找不到'get'控制器:你的控制器名为
GetlookUpDataController,但如果Web API没有启用属性路由,或者属性路由优先级低于传统路由,请求URI里的get会被传统路由的{controller}占位符解析为控制器名称,而你根本没有GetController,所以匹配失败。 - 找不到匹配的HTTP资源:你的
Retreive方法标记了[HttpGet]却用了[FromBody]——GET请求本身没有请求体,这个参数绑定会直接失败,导致框架找不到能处理该请求的方法;另外这个Profile data参数在方法里根本没用到,属于冗余代码。
具体修复步骤
1. 启用并优先配置属性路由
打开项目里的App_Start/WebApiConfig.cs,确保先启用属性路由,再配置传统路由(如果需要保留的话):
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 } ); } }
2. 修正GET方法的参数绑定
直接移除多余的[FromBody]和Profile data参数(因为你方法里没用到它):
[RoutePrefix("api/get")] public class GetlookUpDataController : ApiController { private readonly UserProfileRepository lookUpRepo; public GetlookUpDataController() { lookUpRepo = new UserProfileRepository(); } [HttpGet] [Route("GetUserData")] public IHttpActionResult Retreive() // 移除[FromBody]和无用参数 { var retrieveResult = lookUpRepo.View(); if (retrieveResult.Length > 4) { return Ok(retrieveResult); } else { Console.Write("error"); return Ok("error"); } } }
如果后续需要传递参数给View()方法,改用[FromUri]从URL查询字符串获取参数:
[HttpGet] [Route("GetUserData")] public IHttpActionResult Retreive([FromUri] Profile data) { var retrieveResult = lookUpRepo.View(data); // 假设View方法接受参数 // ... 原有逻辑 }
对应的请求URI示例:http://192.168.250.113/PrimaSysWebAPI/api/get/GetUserData?UserId=123&UserName=test
3. 额外验证点
- 确认控制器确实继承自
ApiController(你的代码已经满足); - 检查项目的命名空间,确保
GetlookUpDataController在Web API默认扫描的范围内; - 确认服务器站点的虚拟路径是
PrimaSysWebAPI(和你请求URI里的路径一致)。
这样修改后,你的请求http://192.168.250.113/PrimaSysWebAPI/api/get/GetUserData就能正确匹配到控制器和方法了。
内容的提问来源于stack exchange,提问作者Partson Zunza
相关产品推荐
相关产品推荐

