在路由配置中使用操作时,发现多个操作与请求匹配

本文关键字:操作 请求 发现 配置 路由 | 更新日期: 2023-09-27 18:29:08

我目前正在使用Web API 2.2 构建一个API

我有RESTful部分在工作,但现在我需要一个非RESTful控制器:

 public class PremisesController : ApiController
    {
        private PremiseService _service;
        public PremisesController()
        {
            _service = new PremiseService();
        }
        [HttpGet]
        public IHttpActionResult Premise(string id)
        {
            id = id.Replace(" ", String.Empty).ToUpper();
            List<Premise> premises = _service.GetPremisesForPostcode(id);
            return Ok(premises);
        }
        [HttpGet]
        public IHttpActionResult Building(string id)
        {
            double premise = Convert.ToDouble(id);
            Building building = _service.GetBuildingsForPremise(premise);
            return Ok(building);
        }
    }

路由配置如下:

        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        config.Routes.MapHttpRoute(
            name: "ActionApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

当我启动GET操作时,我得到了一个错误,它无法区分这两种方法:

发现多个操作与请求匹配

所以我的问题是,我需要在每个方法的顶部指定Route属性吗?如果需要,为什么?第二条路线(ActionApi)不是处理这种情况吗?

在路由配置中使用操作时,发现多个操作与请求匹配

编辑:

我刚刚测试了你的代码,它的工作方式…也许只是不清楚。

  • /api/Premise/Premise/8-->将带您进行第一次操作
  • /api/Premises/Building/8-->将带您进行第二次操作
  • /api/Premises/8-->将导致错误,因为路由将通过GET请求转到第一个规则api/{controller}/{id},然后他无法区分您想要的操作,因为它们都与第一个路由匹配:(api/Premise/{id})

您也可以在控制器上使用RoutePrefix属性。

[RoutePrefix("api/premises")]
public class PremisesController : ApiController

与路由属性相结合意味着您不应该使用相同的路由

获得多个操作