从生产代码中排除控制器
Excluding a controller from production code
我们正试图从我们的生产代码中排除某些控制器(我们公开某些端点以供集成 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();
}
}
}
所以基本上我们只是用 NonProduction 属性装饰 "offending" 控制器,我从 ApiExplorerSettingsAttribute 继承以从生成的文档中排除控制器。
一个问题可能是环境变量的使用,也许以某种方式从 IHostingEnvironment 获取它?
或者您会建议一个完全不同的替代方案(即排除控制器)吗?
将所有 "TestOnly" MVCControllers and/or ApiControllers 移动到它自己的区域。这也可以帮助您更快地识别仅测试代码。
在您的 AreaRegistration 中,不要根据您所在的服务器/环境注册任何路由。
如果您不指定路线,asp.net 将 return 为您提供 404。
您甚至可以走那么远,将所有测试代码移动到它自己的程序集中并包含它(如果需要),甚至不要 build/deploy 它出现在产品中。 https://blog.longle.io/2012/03/29/building-a-composite-mvc3-application-with-pluggable-areas/
我们正试图从我们的生产代码中排除某些控制器(我们公开某些端点以供集成 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();
}
}
}
所以基本上我们只是用 NonProduction 属性装饰 "offending" 控制器,我从 ApiExplorerSettingsAttribute 继承以从生成的文档中排除控制器。
一个问题可能是环境变量的使用,也许以某种方式从 IHostingEnvironment 获取它?
或者您会建议一个完全不同的替代方案(即排除控制器)吗?
将所有 "TestOnly" MVCControllers and/or ApiControllers 移动到它自己的区域。这也可以帮助您更快地识别仅测试代码。
在您的 AreaRegistration 中,不要根据您所在的服务器/环境注册任何路由。
如果您不指定路线,asp.net 将 return 为您提供 404。
您甚至可以走那么远,将所有测试代码移动到它自己的程序集中并包含它(如果需要),甚至不要 build/deploy 它出现在产品中。 https://blog.longle.io/2012/03/29/building-a-composite-mvc3-application-with-pluggable-areas/