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

Hiding Get-Action in Web API (mvc)

我有一个网络 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 }
);

控制器中有两个动作:

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

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

这有效。

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

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

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

您正在做一些非常奇怪的事情:您将默认 RESTful 样式路由与基于操作的路由混为一谈。

根据您当前的配置,您的第二条路线将匹配任何 ULR,例如 /api/User/XXX/4711,其中 XXX 是任意值。不管 XXXGet 还是其他任何东西。

要避免第二条路由接受任何东西,你唯一可以做的就是使用路由约束。但是,要这样做,您必须有一套固定的规则。例如,如果您只想排除 Get,您可以使用正则表达式约束来做到这一点。但是如果你不知道规则,当然是不能执行的。

推荐

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