C# 找不到与请求 URI“https://localhost:44314/api/Test/XXX”匹配的 HTTP 资源

.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();
        }

    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值