.net framework webapi项目报错:<Error> <Message>找不到与请求 URI“https://localhost:44314/api/Test/GetZhuangZhis”匹配的 HTTP 资源。</Message> <MessageDetail>在控制器“Test”上找不到与该请求匹配的操作。</MessageDetail> </Error>
只有一个get方法时,可以请求,不报错,当有俩个get方法时开始出现以上报错,都不能请求了
问题发生原因:
- 两个
GET
请求方法都没有指定具体的路由路径(即没有使用[Route]
特性),这意味着它们都默认使用控制器的名称Test
和 HTTP 方法(GET
)来映射路由。 - 默认情况下,ASP.NET Web API 将根据方法名称来映射请求路径。例如:
GET /api/test
映射到TestController
中的GetNianJis
方法。- 由于没有指定其他路由路径,
GET /api/test
也会映射到GetZhuangZhis
方法。
这就可能导致两个方法都映射到相同的路由 /api/test
,因此发生路由冲突。当你请求 GET /api/test
时,Web API 无法决定应该执行哪个方法,导致请求失败。
public class TestController : ApiController
{
TestBLL bll = new TestBLL();
[HttpGet]
public List<NianJi> GetNianJis()
{
return bll.GetNianJis();
}
[HttpGet]
public List<zhuangzhi> GetZhuangZhis()
{
return bll.GetZhuangzhis();
}
}
最简单的解决办法是:
public class TestController : ApiController
{
TestBLL bll = new TestBLL();
[HttpGet]
[Route("api/Test/GetNianJis")]
public List<NianJi> GetNianJis()
{
return bll.GetNianJis();
}
[HttpGet]
[Route("api/Test/GetZhuangZhis")]
public List<zhuangzhi> GetZhuangZhis()
{
return bll.GetZhuangzhis();
}
}
在方法上添加Route属性是加上“api/控制器的名称”
第二种解决方法:
在控制器类上加上 [RoutePrefix("api/Test")]
RoutePrefix
的作用
RoutePrefix
特性用于指定控制器类的路由前缀,从而避免在每个动作方法上重复指定相同的路由前缀。它是通过在控制器类上应用的,可以为该控制器下所有的路由动作提供统一的路由前缀。
RoutePrefix
如何工作
RoutePrefix
会将指定的前缀部分自动添加到所有路由中。这意味着,在ProductsController
类上标记[RoutePrefix("api/Test")]
后,所有在该控制器类中的路由都会默认带上api/Test
作为路由前缀。- 方法级的
[Route]
特性会根据控制器的前缀进行拼接。
RoutePrefix
的常见用途
-
模块化路由设计:如果您有多个类似的控制器,使用
RoutePrefix
可以帮助您保持路由的一致性。例如,所有涉及产品的操作都可以有api/products
前缀,所有涉及订单的操作都可以有api/orders
前缀。 -
减少代码重复:通过为控制器设置统一的前缀,避免了每个动作方法都重复编写相同的路由部分,代码更加简洁易维护。
-
清晰的路由结构:使用
RoutePrefix
可以帮助你在路由结构上有更清晰的分层,使得 API 路径更具可读性和可扩展性。
[RoutePrefix("api/Test")]
public class TestController : ApiController
{
TestBLL bll = new TestBLL();
[HttpGet]
[Route("GetNianJis")]
public List<NianJi> GetNianJis()
{
LogUtils.Info("开始执行获取年级方法");
return bll.GetNianJis();
}
[HttpGet]
[Route("GetZhuangZhis")]
public List<zhuangzhi> GetZhuangZhis()
{
return bll.GetZhuangzhis();
}
}