3

在 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<Event> GetEventsByDays(int idLocation, int days) {
        // do stuff
    }

    // GET api/locations/123?state=md
    public IEnumerable<Location> GetLocationsByState(string state) {
        // do stuff
    }
}

这里真的有两个问题:

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

2 回答 2

1

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

路由

路由在 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 操作方法而无需滚动,那么您就有问题了

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

我希望这能帮到您。我想你对路由不是很熟悉,所以不要犹豫,阅读introaction selection

于 2013-05-17T19:58:26.590 回答
0

如果您想独立于位置操作事件,您可以有一个单独的事件控制器。请看看是否有帮助。

于 2013-05-17T17:49:02.563 回答