在我最初创建MVC4 Web API的过程中。我注意到一些关于路线处理方式的事情似乎有点过时了:
我创建了相当大的网站,只使用了两三条路线,但我刚开始使用我的API而且我已经差不多十几个了。我认为API本质上适用于比网站更深的URL,但这看起来有点过分。
我觉得我错过了某处的命名空间或路由约定。我将几乎所有这些归结为动作名称不再是路由的一部分,只是HTTP方法。有没有办法通过参数匹配,控制器名称和HTTP方法以外的任何方式来支持路由?
答案 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。您可能已经注意到,您可以使用不同的路径将它们混合在同一个项目中。