Asp.net web api 从生产代码中排除控制器

Asp.net web api 从生产代码中排除控制器,asp.net-web-api,asp.net-core,integration-testing,Asp.net Web Api,Asp.net Core,Integration Testing,我们试图从生产代码中排除某些控制器(我们为集成UI测试所需的API操作公开某些端点) 看一看下面的代码片段,你能看出遵循这种方法有什么根本性的错误吗 [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] public class NonProductionAttribute : ApiExplorerSettingsAttribute, IActionFilter { public

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

看一看下面的代码片段,你能看出遵循这种方法有什么根本性的错误吗

[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();
        }
    }
}
因此,基本上,我们只是用非生产属性装饰“冒犯”的控制器,我从ApiExplorerSettingsAttribute继承来将控制器从生成的文档中排除

一个问题可能是环境变量的使用,也许是从IHostingEnvironment获得的

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

将所有“仅测试”MVC控制器和/或APIController移动到它自己的区域。这有助于您更快地识别仅测试代码

在AreaRegistration中,只需不根据您所在的服务器/环境注册任何路由即可

如果不指定路由,asp.net将为您返回404


您甚至可以这么做,将所有测试代码移动到它自己的程序集中并包含它(如果需要),甚至不在产品上构建/部署它。

您可以将环境变量放在web.config中,然后为每个环境转换配置。我以前做过这件事,效果很好,我认为这件事的env变量部分很好,只是你可以用抽象的方法来抽象它,唯一让人想到的是,你的route表中会有所有这些非prod路由。这也让人觉得有点风险,如果做得不对,可能会有泄漏到prod的风险。你可以查看构建时过程来做同样的事情。@Matt我最初的设计只涉及构建过程,包括需要的内容。我尝试了区域方法(.net core),但在mac上正确路由时遇到问题。。。(在我以前的项目中效果很好)也许我必须再试一试?可能只是错过了一些小的成功:D,我想我会遵循这个方法