1

在我最初尝试创建 MVC4 Web API 时。我注意到关于路由处理方式的一些事情似乎有点不对劲:

  • 控制器不再有超过 4 个动作?
  • 仅支持一个 HTTP 动词的资源仍然拥有它自己的控制器?
  • 路线层次往往非常平坦,或者
  • 与人类的 MVC 应用程序相比,必须指定/维护大量的路由。

我已经创建了相当大的站点,只使用了两到三个路由,但我刚刚开始使用我的 API,而且我已经接近十几个。我想 API 从本质上来说更适合于比网站更深的 URL,但这似乎有点过分了。

我觉得我在某处缺少命名空间或路由约定。我几乎将所有这一切都归因于动作名称不再是路由的一部分,只是 HTTP 方法的一部分。除了参数匹配、控制器名称和 HTTP 方法之外,还有其他方法支持路由吗?

4

2 回答 2

4

您可以在 Global.asax 中修改路由。默认设置为:

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

但是您可以将其更改为例如使用操作名称:

routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }

有关 MVC WEB API 中自定义路由的更多信息,请查看这篇文章

根据评论更新

以上是对“我可以更改路由吗?”问题的答案。简短的回答是肯定的,但正如在另一个答案中指出的那样,您可能不想维护一个好的 REST API。带有默认路由的 MVC Web API 维护您正在处理资源的基本 REST 概念,控制器代表资源。在您的另一个问题中,您举了一个例子:

DELETE /account/1234/note/321 <- delete note 321 on account 1234

您要删除帐户 1234 上的注释的位置。在这种情况下,您正在处理的资源是注释。对此更好的表示是使用查询字符串,因此本示例的 API 如下所示:

DELETE /note/321?account=1234 <- delete note 321 on account 1234

这样您就不需要弄乱路由,并且很明显,被操作的资源是使用过滤器的注释。但是我也会质疑如果 note 的 id 对于整个应用程序而不只是特定帐户是唯一的,是否有必要添加这个显式过滤器(即 where 子句)。

于 2012-07-12T20:27:24.463 回答
1

Web API 是为 RESTFull 服务设计和定制的,将控制器视为服务名称。按照约定,GET/PUT/POST/DELETE 映射到名称包含动词的控制器操作。

如果你不想做一些 RESTFull 的事情,那么我会使用 HTTPController 来代替。正如您可能注意到的那样,您可以将它们混合在同一个项目中并使用不同的路线。

于 2012-07-12T20:18:08.650 回答