Webapi自定义路由操作

时间:2016-05-28 14:51:11

标签: c# asp.net-mvc asp.net-web-api routes

情况:

我已经创建了扩展ApiController的控制器类,并包含以下方法:

        // GET api/Posts/5
        [ResponseType(typeof(Post))]
        public IHttpActionResult GetPost(int id)
        {
           ...
        }

        // GET api/Posts/ByBoardID/2
        [HttpGet]
        [ActionName("ByBoardID")]
        public IQueryable<Post> GetByBoardID(int boardID)
        {
           ...
        }

想法是将这些方法与给定路由匹配(即'api / Posts / ByBoardID / 2'到GetByBoardID(int boardID)方法,'api / Posts / 2'到GetPosts(int id)方法)

这是路线配置:

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

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

问题:

第二条路线('api / Posts / ByBoardID / 2')无法匹配 - No HTTP resource was found that matches the request URI

问题:

在控制器内部创建此类“嵌套”路由的最佳做法是什么?我将使用具有相同模式(/{controller}/{id} and /{controller}/bySpecialParam/{id})的许多控制器,因此我不想'硬编码'这种不可重复使用的路由。

2 个答案:

答案 0 :(得分:1)

只有通过改变这个组合才能实现这种组合

[ActionName("ByBoardID")]

[Route("api/Posts/ByBoardID/{boardID}")]

永远无法弄清楚ActionName属性的工作原理,因此始终首选使用Route属性

答案 1 :(得分:0)

  

这有效:

1)为控制器中的两个方法提供actionName。

[ActionName("DefaultAction")]
[ActionName("ByBoardID")]

2)在webapiconfig类中,添加以下路由

config.Routes.MapHttpRoute(
                "defaultActionRoute",
                "{controller}/{action}/{id}",
                null,
                new
                {
                    action = "ByBoardId"
                });
            config.Routes.MapHttpRoute(
                "defaultRoute",
                "{controller}/{id}",
                new
                {
                    action = "DefaultAction"
                });

确保GlobalConfiguration.Configuration.EnsureInitialized();方法末尾有Application_Start()