1

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

4

2 回答 2

0

编辑:

我刚刚测试了你的代码,它按原样工作......也许只是不清楚。

  • /api/Premises/Premise/8 --> 将带您进行第一个操作
  • /api/Premises/Building/8 --> 将带您进行第二个操作
  • /api/Premises/8 --> 将导致错误,因为路由将使用 GET 请求转到第一个规则 api/{controller}/{id} ,然后他无法区分您想要哪些操作,因为它们都匹配第一条路线:(api/Premises/{id})
于 2014-11-05T09:19:09.377 回答
0

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

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

这与 route 属性相结合意味着您不应该使用相同的路线获得多个操作

于 2014-11-05T11:24:36.300 回答