【问题标题】:Excluding a controller from production code从生产代码中排除控制器
【发布时间】:2017-08-17 09:06:13
【问题描述】:

我们正试图从我们的生产代码中排除某些控制器(我们为集成 UI 测试所需的 API 操作公开了某些端点)

看看下面的sn-p,你能看出遵循这种方法有什么根本错误吗?

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class NonProductionAttribute : ApiExplorerSettingsAttribute, IActionFilter
{
    public NonProductionAttribute()
    {
        IgnoreApi = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == EnvironmentName.Production;   
    }

    public void OnActionExecuted(ActionExecutedContext context) { }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        if (IgnoreApi)
        {
            context.Result = new NotFoundResult();
        }
    }
}

所以基本上我们只是用 NonProduction 属性装饰“有问题的”控制器,我从 ApiExplorerSettingsAttribute 继承以从生成的文档中排除控制器。

一个问题可能是环境变量的使用,也许以某种方式从 IHostingEnvironment 获得它?

或者您会建议一个完全不同的替代方案(排除控制器)?

【问题讨论】:

  • 您可以将环境变量放在 web.config 中,然后为每个环境转换配置。我以前做过,效果很好
  • 我认为 env 变量部分很好,除了你可以使用 config 抽象它,唯一的负面想法是你的路线中会有所有这些非产品路线桌子。它也感觉有点风险,如果做错了事情可能会泄露给prod,这是有风险的。您可以查看构建时间过程来做同样的事情。
  • @Matt 我最初的设计只涉及构建过程,包括需要的东西

标签: asp.net-web-api asp.net-core integration-testing


【解决方案1】:

将所有“TestOnly”MVCControllers 和/或 ApiControllers 移动到它自己的区域。这也有助于您更快地识别仅测试代码。

在您的 AreaRegistration 中,不要根据您所在的服务器/环境注册任何路由。

如果你不指定Route,asp.net会为你返回404。

您甚至可以走那么远,将所有测试代码移动到它自己的程序集中并包含它(如果需要),甚至不要在 prod 上构建/部署它。 https://blog.longle.io/2012/03/29/building-a-composite-mvc3-application-with-pluggable-areas/

【讨论】:

  • 我尝试了区域方法(.net 核心),但在我的 mac 上正确路由时遇到问题......(在我的旧项目上运行良好)也许我必须再试一次?可能只是错过了一些小事
  • 啊成功 :D,我想我会遵循这种方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 2011-11-15
相关资源
最近更新 更多