在Route config中使用操作时,发现多个匹配请求的操作

时间:2014-11-05 08:43:49

标签: c# asp.net-web-api2 asp.net-web-api-routing asp.net-mvc-5.2

我目前正在使用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)没有处理这种情况吗?

2 个答案:

答案 0 :(得分:0)

编辑:

我刚刚测试了你的代码,它的工作方式就是这样......也许只是目前还不清楚。

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

答案 1 :(得分:0)

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

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

与路由属性相结合意味着你不应该使用相同的路径获得多个动作