【问题标题】:ASP.NET5 MVC6 routingASP.NET 5 MVC 6 路由
【发布时间】:2015-11-24 04:00:12
【问题描述】:

我在 Startup.cs 中定义了以下路由:

app.UseMvc(routes =>
{
   routes.MapRoute(
      name: "api",
      template: "api/{controller}/{action}/{id?}"
   );
});

还有以下控制器:

public class BookmarksController : Controller
{
    [HttpGet]
    public string GetAll()
    {
        return "GetAll Action";
    }

    [HttpGet("{id}")]
    public string Get(int id)
    {
        return "Get action";
    }
}

谁能解释一下为什么我可以通过api/bookmarks/getall调用GetAllAction,但不能通过api/bookmarks/get/调用Get 3 ?

【问题讨论】:

    标签: asp.net-web-api routing asp.net-core asp.net-core-mvc


    【解决方案1】:

    这是设计使然。如果您有使用属性路由装饰的控制器/动作,则任何与常规路由(在 Startup.cs 中定义的路由)匹配的请求都无法找到/到达这些控制器/动作。这就是GetAll 可以通过使用常规路由调用的原因,因为您应该能够通过像/10 这样的url 到达Get(int id)(当然,您可能想修改此模板:-))

    【讨论】:

    • 在我的示例中,类和动作都没有用属性路由修饰,并且 api/bookmarks/get/3 匹配 api/{controller}/{action}/{id?} 路由模板。
    【解决方案2】:

    哦!我想我明白了。

    要调用 Web API 的操作方法,无需在 URL 中包含方法名称。

    GetAll() 可以通过 api/bookmarks/ 调用,而不是通过 api/bookmarks/getall 并且Get(int id) 可以通过 api/bookmarks/3 而不是 api/bookmarks/get/3 调用

    【讨论】:

    • 你使用过 WebCompatShim 吗?它看起来不像标准行为,因为您没有为控制器指定 Route 属性。没有它,您的操作必须在没有api/bookmarks/ 的情况下可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 2015-12-09
    • 2015-04-06
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多