在Web API中的id参数之后使用操作进行路由

在web api中,默认路由是: /api/locations/123?days=5

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

但是,如果我希望路径看起来像这样/api/locations/123/events?days=5同时仍然可以使用类似这样的路径命中LocationsController /api/locations/123?state=md

控制器:

 public class LocationsController : ApiController { // GET api/locations/123/events?days=5 public IEnumerable GetEventsByDays(int idLocation, int days) { // do stuff } // GET api/locations/123?state=md public IEnumerable GetLocationsByState(string state) { // do stuff } } 

这里真的有两个问题:

  1. 有一个返回事件的LocationsController或者是否应该有一个完全独立的控制器是否有意义?
  2. 如何设置WebApiConfig的路由以允许这样的路由?

你在谈论两件不同的事情:

路由

在ASP.NET MVC和Web Api中使用路由将URL直接映射到控制器和/或操作。 这对于可读性特别有用,因为开发人员可以专注于设计人类可读的URL(例如,产品支持和搜索引擎索引)。 重要的是,路由和控制器之间没有唯一的关系。 如果需要,您可以创建10个路径来映射相同的控制器/操作。

例如,您的两条路线可能是这样的

 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{idLocation}/events/{days}", defaults: new { id = RouteParameter.Optional } ); 

另请注意, /api/locations/123?state=md对于默认路由模板不正确。 这是/api/locations/123 。 因为url中有一个额外的参数,所以你将执行GetLocationsByState。

调节器

建议每个控制器具有一个单一的责任,并尽可能小。 您的业​​务逻辑应该在其他地方。

Jeffrey Palermo(洋葱建筑的创造者)说

如果您无法在屏幕上看到ASP.NET MVC操作方法而不必滚动,则会出现问题

最后,就像你的一切一样,你可以做你想做的事情而不用关注它是好还是坏。 困难并不总是建立一个架构,而是维护和遵循自己的规则。

我希望这能帮到您。 我想你不是那么熟悉路由,所以不要犹豫,阅读介绍和动作选择 。

如果您想要独立于位置操作事件,则可以为事件设置单独的控制器。 请查看这是否有帮助。