路线MVC 4的Web API的?(Routes for MVC 4 Web APIs?)

2019-09-19 09:54发布

在我创造一个MVC4的Web API的初始刺伤。 我注意到有关路由的处理方式,这似乎有点过了几件事情:

  • 控制器不再曾经有4个以上的行动?
  • 仅支持的HTTP动词的资源仍然得到它自己的控制?
  • 路由层次往往是非常平坦,OR
  • 一个非常大的数量的路由,必须指定/比MVC应用对人类维持。

我创建了仅使用两个或三个途径相当大的网站,但我刚开始在我的API和我到几乎一打。 我猜其性质的API借给自己不是网站的网址更深,但是这似乎有点过分。

我觉得我缺少某处命名空间或路由惯例。 我的属性几乎所有的这一个事实,即动作名称是路线的部分不再,只是HTTP方法。 是否有比参数匹配,控制器名称和HTTP方法以外的任何支持路线的方法吗?

Answer 1:

您可以修改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是整个应用程序的唯一,而不仅仅是特定帐户。



Answer 2:

在Web API的设计和REST类型的服务定制,认为控制器作为服务名称。 GET / PUT / POST / DELETE映射到控制器动作谁的名称中包含动词,按照约定。

如果你不试图做一些事情的REST类型的,那么我会用一个HTTPController代替。 正如你可能已经注意到,您可以用不同的途径同一项目中混合。



文章来源: Routes for MVC 4 Web APIs?