【问题标题】:Specify valid controllers for a route为路由指定有效的控制器
【发布时间】:2013-03-11 17:12:05
【问题描述】:

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

/public/{controller}/{id}

/private/{controller}/{id}

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

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

感谢您的回复。

【问题讨论】:

  • 你能用一些代码展示你的路线目前的样子吗?
  • 我实际上没有任何代码。我在问题中提到的代码是一些示例代码来解释我的问题。

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


【解决方案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”路由只接受名为 Private 的控制器,而“public”路由只接受名为 Public 的控制器。如果您有多个公共和私有控制器,您可以轻松扩展正则表达式以匹配它们。

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

【讨论】:

  • 谢谢,这正是我所需要的。
猜你喜欢
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
相关资源
最近更新 更多