【问题标题】:Making a controller not visible to the client in ASP.NET WEB API (or MVC)在 ASP.NET WEB API(或 MVC)中使控制器对客户端不可见
【发布时间】:2014-12-16 13:23:39
【问题描述】:

假设我有一个抽象控制器层,它将请求委托给它的子控制器类,直到它到达实现。

把它想象成一个控制器管道,请求必须通过,包括缓存响应、授权和验证用户、验证输入和输出数据、处理存储库访问等。

我的 leaf 类(层次结构的最后一个子级),可能具有以下签名:

public class SeasonsController : DefaultPersistenceRestController
                                 <int, Season, SeasonPutDTO, SeasonPostDTO, SeasonQueryData> {
      /** Controller implementation here  **/
}

基类在一个模块中有很多可重用的代码,这很好,在全局级别更改控制器逻辑时对我有很大帮助。

现在,假设 SeasonsController 出于不相关的原因需要致电 EpisodesController。

调用会是这样的:

EpisodesController episodeController = new EpisodesController();
//Do something with EpisodesController

问题是我不希望EpisodesController被外部访问,比如客户端的请求。 ASP.NET 自动识别控制器并为其创建公共端点,例如http://localhost:80/episodes。

我创建了EpisodesController,因为它使用了控制器基类中的大量逻辑,但我打算在内部使用它。

如果以这种方式使用控制器,我可以停用身份验证、授权、缓存和所有其他无用的东西,所以这不是问题。

但是,我无法阻止 ASP.NET 忽略我的 EpisodesController 类,并且不将其视为控制器。

是否有一个属性或注释可能会告诉编译器这样做?可能在 Web.config 中进行了一些修改?

另外请注意,我不想将EpisodesController 的类名更改为另一个名称,因为它实际上是一个控制器,而是一个内部控制器。

【问题讨论】:

  • 如果你想防止动作被调用,为什么不让它们不公开呢?或者如果它们必须是公开的,也许可以试试这样:stackoverflow.com/questions/4390541/…
  • 如果它是私有的,为什么它需要成为控制器?

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api


【解决方案1】:

您可以尝试使用IgnoreRoute 扩展方法。或者你可以试试 beautifulcoder 建议的internal。如果它在另一个程序集中(并且您可以修改它),您还可以使用 InternalsVisibleToAttribute 使其对其他程序集可见。

虽然老实说,在我看来,在另一个控制器中使用一个控制器并不合适。我会尝试将您的常用功能重构为服务/帮助程序,然后您也可以将您的 EpisodesController 变成一个简单的服务。组合优于继承等等:)

【讨论】:

【解决方案2】:

如果您创建一个控制器public,它将可以访问。据我了解,您可以将其更改为protected 或internal。

【讨论】:

  • 如果控制器在另一个程序集中怎么办?
  • 将它移动到同一个程序集可能是个好主意。你也可以试试protected internal
猜你喜欢
  • 1970-01-01
  • 2012-09-21
  • 2019-08-26
  • 2018-06-18
  • 2015-10-01
  • 1970-01-01
  • 2016-05-20
  • 2019-03-24
  • 1970-01-01
相关资源
最近更新 更多