Asp.net web api ASP.NET5 MVC6路由

Asp.net web api ASP.NET5 MVC6路由,asp.net-web-api,routing,asp.net-core,asp.net-core-mvc,Asp.net Web Api,Routing,Asp.net Core,Asp.net Core Mvc,我在Startup.cs中定义了以下路径: app.UseMvc(routes => { routes.MapRoute( name: "api", template: "api/{controller}/{action}/{id?}" ); }); 以及以下控制器: public class BookmarksController : Controller { [HttpGet] public string GetAll()

我在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调用
GetAll
操作,但是不能通过api/bookmarks/GetAll调用
Get
吗?

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

哦!我想我明白了

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

GetAll()
可以通过api/bookmarks/调用,如果api/bookmarks/GetAll
Get(int-id)
可以通过api/bookmarks/3而不是api/bookmarks/Get/3来调用。在我的示例中,类和操作都没有使用属性路由进行修饰,api/bookmarks/Get/3与api/{controller}/{action}/{id}路由模板匹配。您使用WebCompatShim了吗?它看起来不像标准行为,因为您没有为控制器指定路由属性。没有它,您的操作必须在没有
api/bookmarks/
的情况下可用。