隐藏Web API中的Get-Action(mvc)

时间:2015-05-27 08:50:28

标签: asp.net-mvc-routing asp.net-web-api2

我有一个带有以下路线的网络API:

routes.MapHttpRoute(
   name: "DefaultGet",
   routeTemplate: "api/{controller}/{id}",
   defaults: new { controller = "Home",  id = RouteParameter.Optional }
);

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = RouteParameter.Optional }
);

这些是Controller内的两个动作:

public class UserController {
   public HttpResponseMessage Get(int id) {}
   public HttpRespnseMesseage GetDetails(int id) {}
}

第一条路线允许我访问Get() - 方法“/api/User/4711”第二条路线允许我访问GetDetails() - 方法“/api/User/GetDetails/4711”< / p>

这很有效。

但此外,Get() - 方法也可以由“/api/User/Get/4711”调用(并且也会在自动生成的文档中列出)

如何确保我可以通过“/api/User/4711”访问Get-Method,而不是通过“/api/User/Get/4711”访问?

注意:我想保留默认路由,并且不希望只能通过删除我的默认路由并使用路由属性来实现解决方案

1 个答案:

答案 0 :(得分:1)

你正在做一些非常奇怪的事情:你将混淆的RESTful样式路由与基于行动的路由混合起来。

根据您当前的配置,您的第二条路线将匹配任何ULR,例如/api/User/XXX/4711 XXX。无论XXXGet还是其他任何内容。

你唯一能做的就是避免第二条路线接受任何东西就是使用路线约束。但是,为此,您必须拥有一套固定的规则。例如,如果您只想排除Get,则可以使用正则表达式约束来执行此操作。但是,如果您不了解规则,当然,您无法实现它。

建议

当OP最终决定自己时,如果您使用RESTful API路由样式,那么使用自Wep API v2以来可用的路由属性要好得多。 (事实上​​,在以前的版本中有一个Nuget包支持它。)

相关问题