为路径指定有效的控制器

时间:2013-03-11 08:59:13

标签: asp.net-web-api asp.net-web-api-routing

我要为我们的系统提供两个Web API控制器PublicControllerPrivateController。这些应该有以下路线:

/public/{controller}/{id}

/private/{controller}/{id}

在防火墙上,对/private的所有请求都被阻止,只能从网络内部获取。但按照惯例,我的两个控制器都可用于两个路由,因此我可以使用网址PrivateController请求/private(只应在/public/PrivateController/1下提供)。

有没有办法为路由指定有效的控制器,以便PrivateController仅适用于私有路由?还是有其他一些做法来满足这个要求吗?

感谢您的回复。

1 个答案:

答案 0 :(得分:1)

您可以使用constraints参数在最简单的情况下使用非常简单的正则表达式对控制器名称进行限制:

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

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

所以现在“私有”路由只接受名为Private的控制器,而“public”路由只接受名为Public的控制器。如果您有多个公共和私有控制器,则可以轻松扩展正则表达式以匹配它们。

如果正则表达式不足以满足您的需求,您可以通过实现IRouteConstraint接口来创建自定义路由包含。您可以找到一个示例植入In this article