WebAPI - 控制器上未找到任何操作

时间:2015-08-28 21:43:28

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

我正在尝试在RESTapi中建立分层链接。例如:

关注url会给我演员ID 1的详细信息:

/api/v1/actor/id/1/

以下网址预计会给我所有演员身份1的电影:

/api/v1/actor/1/movies

我的路线:

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

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

ActorController中的行为:

        [HttpGet]
        public HttpResponseMessage Id(int id)
        {
            // logic

            return Request.CreateResponse(HttpStatusCode.OK, actor);
        }

        [HttpGet]
        public HttpResponseMessage Movies(int levelOneId)
        {
            // logic
            return Request.CreateResponse(HttpStatusCode.OK, movies);
        }

但是这个设置对我不起作用。

/api/v1/actor/id/1/给了我适当的回应

/api/v1/actor/1/movies引发了以下错误:

No action was found on the controller 'Actor' that matches the name '1'."

我确实关注this thread,但它对我不起作用。

有人可以建议我在这里做错了什么吗?我正在使用MVC 4,WebAPI。

3 个答案:

答案 0 :(得分:1)

尝试切换路线的顺序:

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

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

订单在创建路线时很重要。你拥有它的方式,它首先匹配第一个(默认路由),而不是找到名称为" 1"的行动。

您可能还想查看MVC属性路由,我认为它更容易使用:http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

答案 1 :(得分:1)

这项工作对我有用处:

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


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

基本上我已经为我的网址添加了1个路径级别。它终于成了:

/api/v1/actor/4/details/movies

答案 2 :(得分:0)

使用以下路线:

config.Routes.MapHttpRoute(
   name: "DefaultOneLevelNested", 
   routeTemplate: "api/v1/{controller}/{id}/{action}", 
   constraints: new { controller = "actor", action ="movies" }
);

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

它们应与您的初始网址相匹配。