Web API路由:如何传达"api/{controller}/latest"以及"api/{controller}/{id}"

Tho*_*ess 1 asp.net asp.net-mvc asp.net-web-api

这个问题是非常接近这一个,与未成年人的扭曲.

我想建立一个Web API路由表,这样我就可以提出一个请求api/items/5,api/items/newest以便客户端可以获得最新的项目.

我一直在翻阅一些文章,但在确定我是否以正确的方式进行时并没有太多运气.

我的第一个问题是,允许呼叫者找到最新版本的"正确"或"干净"方式是item什么?可以做一些类似的东西api/items/newest还是不赞同的?

目前,这似乎适用于我的WebApiConfig.cs文件:

config.Routes.MapHttpRoute(
    name: "NewestItems",
    routeTemplate: "api/items/newest",
    defaults: new { controller = "Items" }
);

config.Routes.MapHttpRoute(
    name: "ItemsById",
    routeTemplate: "api/items/{id}",
    defaults: new { controller = "Items" }
);

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

这种方法有效,但我很好奇是否有一种更通用的方法来做到这一点,而不需要制定特定于控制器的路由规则.我曾尝试过以下方法,但由于规则含糊不清,因此无效:

config.Routes.MapHttpRoute(
    name: "ActionWithNoArgument",
    routeTemplate: "api/{controller}/{action}",
);

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

有没有更有效的方法来执行此操作而不依赖于特定于控制器的路由规则?

多谢你们!

iam*_*lin 5

config.Routes.MapHttpRoute(
    name: "NewestItems",
    routeTemplate: "api/{controller}/newest",
    defaults: new { controller = "Items" }
);

config.Routes.MapHttpRoute(
    name: "ItemsById",
    routeTemplate: "api/items/{id}",
    defaults: new { controller = "Items" }
);
Run Code Online (Sandbox Code Playgroud)

自上而下处理路由,并且put {controller}使其成为任何控制器的通用路径