MVC 4 Web API的路由?

时间:2012-07-12 19:54:26

标签: asp.net-mvc-routing asp.net-mvc-4 asp.net-web-api

在我最初创建MVC4 Web API的过程中。我注意到一些关于路线处理方式的事情似乎有点过时了:

  • 控制器不再有超过4个动作吗?
  • 只支持一个HTTP动词的资源仍然可以获得它自己的控制器吗?
  • 路线层次结构趋于平坦,或
  • 与用于人类的MVC应用程序相比,必须指定/维护极其多的路由。

我创建了相当大的网站,只使用了两三条路线,但我刚开始使用我的API而且我已经差不多十几个了。我认为API本质上适用于比网站更深的URL,但这看起来有点过分。

我觉得我错过了某处的命名空间或路由约定。我将几乎所有这些归结为动作名称不再是路由的一部分,只是HTTP方法。有没有办法通过参数匹配,控制器名称和HTTP方法以外的任何方式来支持路由?

2 个答案:

答案 0 :(得分: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中自定义路由的更多信息,请查看此article

根据评论进行更新

以上是问题的答案,“我可以更改路由吗?”简短的回答是肯定的,但正如在另一个答案中指出的那样,您可能不希望并维护一个好的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子句)。

答案 1 :(得分:1)

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

如果您不想尝试RESTFull,那么我会使用HTTPController。您可能已经注意到,您可以使用不同的路径将它们混合在同一个项目中。