路线为特定的控制器(Routes for specific controllers)

2019-10-18 14:31发布

在我的Web API的情况下,这个(默认)路由非常适用于几乎所有的控制器。

config.Routes.MapHttpRoute(
            name: "DefaultRoute",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

和一对夫妇我的控制器,我希望让他们通过动作名称映射,就像这样:

config.Routes.MapHttpRoute(
            name: "ActionRoute",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

背景:

我大部分的控制器都在默认情况下被映射到GEE,POST,PUT和DELETE。 但是,我保留了一些“admin”的控制器,执行操作,如数据初始化,清理和测试的东西。 这些控制器可以具有经由GET excetude多个方法,因此第二路线。

如果我使用这些途径,他们的工作很好,但是,如果我同时设置,我得到的两次失败之一:

默认路由第一:

api/books/                -> OK
api/books/someGuidId      -> OK
api/admin/someAdminAction -> 500 Internal Server Error (multiple actions found)
api/test/sometestAction   -> 500 Internal Server Error (multiple actions found)

行动路线第一:

api/books/                -> OK
api/books/someGuidId      -> 404 Not Found (no action that matches "someGuidId")
api/admin/someAdminAction -> OK
api/test/sometestAction   -> OK

我的问题是:我怎么能有这些线路在同一时间锻炼吗?

[ 编辑 ]

API /书籍/ someGuidId不是一个重要的电话,我可以没有它(通过GET)但是,POST,PUT和DELETE,以相同的URL会失败,至极是不能接受的。

Answer 1:

在击溃的顺序关系,所以你应该先设置更具体击溃:

config.Routes.MapHttpRoute(
        name: "ActionRoute",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

config.Routes.MapHttpRoute(
        name: "DefaultRoute",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

编辑:

Default路由第一:

api/books/

该网址配衬第一图案:API / {控制器} / {ID}。
框架查找books控制器GET (PUT,POST,DELETE)方法,并发现它。 这种方法被调用默认id值。

api/admin/someAdminAction  

此网址还配衬的第一图案。 (顺便说一句,不要紧,你如何在路由定义命名您的参数: idsuperParamName ,当框架与击溃比较URL将只寻找模式和无法通过PARAM名称区分开。

该框架将尝试调用GET (PUT,POST,DELETE)的方法admin控制器someAdminAction ID(其中,我想,是不是值的有效ID :)

类似的事情时,你可以定义你得到Action第一条路线:

api/books/   

配衬api/{controller}/{id} ,ID可以被省略,因为它被设定为“任选的”。

api/books/someGuidId

配衬api/{controller}/{action}/{id}所以,当框架查找someGuidId在操作方法book控制器,并没有找到它,它抛出一个异常。 404未找到(无动作匹配“someGuidId”)

编辑2:我认为,如果你将永远传递id参数有关“操作”和地方“操作”路线首先,你不会得到任何冲突。 尝试这个。
如果您需要id PARAM是可选在两种情况下,你可以从两个击溃删除它,通过正常方式传递? (问号)。

其中之一,这将解决您的路由问题。



文章来源: Routes for specific controllers