在我创造一个MVC4的Web API的初始刺伤。 我注意到有关路由的处理方式,这似乎有点过了几件事情:
- 控制器不再曾经有4个以上的行动?
- 仅支持的HTTP动词的资源仍然得到它自己的控制?
- 路由层次往往是非常平坦,OR
- 一个非常大的数量的路由,必须指定/比MVC应用对人类维持。
我创建了仅使用两个或三个途径相当大的网站,但我刚开始在我的API和我到几乎一打。 我猜其性质的API借给自己不是网站的网址更深,但是这似乎有点过分。
我觉得我缺少某处命名空间或路由惯例。 我的属性几乎所有的这一个事实,即动作名称是路线的部分不再,只是HTTP方法。 是否有比参数匹配,控制器名称和HTTP方法以外的任何支持路线的方法吗?
您可以修改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
这样,您就不需要与路由很乱,很明显,所作用的资源时是带过滤器的说明被使用。 但我也会质疑是否增加这个明确的过滤器(即WHERE子句)是必要的,如果做笔记的id是整个应用程序的唯一,而不仅仅是特定帐户。
在Web API的设计和REST类型的服务定制,认为控制器作为服务名称。 GET / PUT / POST / DELETE映射到控制器动作谁的名称中包含动词,按照约定。
如果你不试图做一些事情的REST类型的,那么我会用一个HTTPController代替。 正如你可能已经注意到,您可以用不同的途径同一项目中混合。