【问题标题】:WebAPI - No action was found on the controllerWebAPI - 在控制器上未找到任何操作
【发布时间】:2015-08-28 21:43:27
【问题描述】:

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

以下网址将为我提供演员 ID 1 的详细信息:

/api/v1/actor/id/1/

下面的 url 应该会给我所有演员 id 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。

【问题讨论】:

  • /api/v1/actor/movies/1 对于获取演员 1 电影来说似乎更自然。它也可以与其他网址在同一条路线上工作。
  • 对我来说这看起来更自然:/api/v1/actor/1/movies 我可以做到这一点吗?
  • 那我想这看起来也更自然吧? /api/v1/actor/1/id
  • @Mihai Caracostea:不,但是这个:/api/v1/actor/1/
  • 这个可行,我会一会发布路线

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


【解决方案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

【讨论】:

  • 感谢您的回答@BFree。我已经尝试过了,它不起作用。如果我切换顺序,另一条路线将停止工作。我的意思是这个 /api/v1/actor/id/1/
  • 啊,我看错了你的问题。如果您想遵循 REST,您的路线应该是:/api/v1/actor/1,然后将您的 Id 操作更改为仅称为 Get。这应该适用于我布置的路线配置。
  • 这是因为两个 url 都匹配两个路由。请参阅我对这个问题的评论。如果它适合您的需求,我会将其作为答案发布。
  • @BFree:我确实将 Id 更改为 Get(int id),但它不起作用。更改为 Get() 也行不通,因为我需要 id,像这样 /api/v1/actor/1 你能解释一下你的解决方案吗?
  • 使用属性路由,你会遇到更少的问题。记得使用参数约束。
【解决方案2】:

这项工作对我有用:

 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

【讨论】:

    【解决方案3】:

    使用这些路线:

    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 }
    ); 
    

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

    【讨论】:

    • 感谢@Mihai 的回答。使用您的解决方案,这有效:api/v1/actor/1/movies 但是 /api/v1/actor/id/1/ 仍然给出错误:在控制器上找不到任何操作
    • /api/v1/actor/1 也应该可以工作并被路由到 Id 操作。
    • 只要确保你已经删除了其他路由。
    • 已删除,但 /api/v1/actor/id/1/ 的错误仍然相同,在控制器“Actor”上找不到与名称“1”匹配的操作。最终路由:config.Routes.MapHttpRoute(name: "DefaultOneLevelNested", routeTemplate: "api/v1/{controller}/{id}/{action}", defaults: new { id = "id" } );
    • 使用 /api/v1/actor/1 或 /api/v1/actor/1/id 你说第一个版本可以接受。
    猜你喜欢
    • 2013-01-07
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2013-04-24
    • 1970-01-01
    相关资源
    最近更新 更多