ASP.NET Core 托管环境变量被忽略
Posted
技术标签:
【中文标题】ASP.NET Core 托管环境变量被忽略【英文标题】:ASP.NET Core hosting environment variable ignored 【发布时间】:2016-10-17 11:21:31 【问题描述】:我的暂存服务器上有两个网站,它们都是在 IIS 中运行的 ASP.NET Core 网站。我已将环境变量 ASPNETCORE_ENVIRONMENT
设置为 Staging
机器范围。这适用于其中一个站点,但另一个站点忽略该变量并改为在生产模式下运行。我必须将托管环境配置到web.config
文件中才能在暂存模式下运行。
为什么一个站点不考虑环境变量?
在我的两个Startup(IHostingEnvironment env)
构造函数中,我都使用了环境变量:
public Startup(IHostingEnvironment env)
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.env.EnvironmentName.json", optional: true)
.AddJsonFile("logging.json")
.AddEnvironmentVariables(); // <---
Configuration = builder.Build();
【问题讨论】:
只是为了仔细检查-您确定,ASPNETCORE_ENVIRONMENT=Staging 在第二个实例上,但是 env.EnvironmentName 为它返回“Production”并且不使用来自 appsettings.Staging.json 的值?对了,你不会忘记发布 appsettings.Staging.json 文件吗? 我不在这两个网站上使用appsettings.Staging.json
。 ASPNETCORE_ENVIRONMENT 在机器范围内设置。第二个站点日志的启动日志记录:“环境:生产”。
你能检查一下 Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") 返回什么吗?
[09:20:33 INF] ASPNETCORE_ENVIRONMENT = '' Hosting environment: Production
通过 IIS 启动时,[08:56:07 INF] ASPNETCORE_ENVIRONMENT = 'Staging' Hosting environment: Staging
直接在控制台上独立启动时。
IIS doesn't use user environment variables的可能重复
【参考方案1】:
正如this similar question 中所说,诀窍只是设置应用程序池以加载用户变量(IIS -> 服务器 -> 应用程序池 -> 右键单击池 -> 设置应用程序池默认值... ->加载用户配置文件 = True)。
我只相应地配置了我的一个应用程序池,因此只有一个站点可以访问环境变量。
【讨论】:
我已经尝试过解决我的类似问题,但它并不能解决我的问题。 也为我工作。我想知道为什么将环境变量设置为机器变量不起作用.. 也为我工作,根据MS doco machine env var 应该很奇怪.. 在命令行设置环境变量时不要使用set
,而是setx
。并添加/M
设置机器范围,不适用于本地用户,因为应用程序池可以使用其他用户【参考方案2】:
我刚刚花了几个小时来处理同样的问题。我不确定结果是否相同,因为您似乎有两个应用程序之一在工作。
我通过 Windows Server 2008 R2 上的“高级系统设置”将 ASPNETCORE_ENVIRONMENT 设置为“暂存”作为系统变量,并且始终处于“生产”环境中(如果找不到设置,这是默认环境任何地方)。
使用命令提示符中的“set”显示“ASPNETCORE_ENVIRONMENT=Staging”的预期结果。
调用 Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") 返回 null。我创建了另一个名为“Test”的变量,它也返回 null。调用任何其他现有变量都会返回预期结果。
我尝试回收应用程序池,更改应用程序池的用户,通过管理控制台重新启动 IIS,甚至重新启动万维网发布服务(可能与 IIS 管理控制台中的重置相同)均无济于事。
重启服务器是让应用程序返回预期结果的唯一方法。
【讨论】:
holy sxxx,为这个问题浪费了我 30 分钟的时间,谢谢你的帖子【参考方案3】:如果您在 Visual Studio 中调试代码,请记住,Visual Studio 会缓存 Visual Studio 启动时存在的环境变量 - 而不是在您点击“调试”时!
因此,您可能必须重新启动 Visual Studio 才能看到对环境的任何更改。
【讨论】:
【参考方案4】:在 cmd 窗口中,运行 net stop /y was && net start w3svc
。
来源:ASP.NET Core 文档 -> Use multiple environments in ASP.NET Core
注意:通过右键单击->停止->在 IIS 管理器中启动重新启动 IIS 将不起作用。
【讨论】:
文章说重述是第二种选择【参考方案5】:public Startup(IHostingEnvironment env)
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.env.EnvironmentName.json", optional: true);
if (env.IsDevelopment())
// For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
builder.AddUserSecrets();
builder.AddEnvironmentVariables();
Configuration = builder.Build();
您可能没有添加变量builder.AddEnvironmentVariables();
【讨论】:
我检查了这个,它在两个项目中都有。 AddEnvironmentVariables() 不会更改 env.EnvironmentName 的值。它允许 ro 从环境变量中读取配置值。 如果没有AddEnvironmentVariables()
,IsDevelopment()
是否工作?
@Thaoden IsDevelopment 只是 env.EnvironmentName == "Development" 的包装。 env.EnvironmentName 默认使用 ASPNETCORE_ENVIRONMENT 在内部设置。由于 IHostingEnvironment.EnvironmentName 有一个 getter,因此可以直接在代码中更改该值,但 AddEnvironmentVariables() 不会更改该值,而是允许使用环境变量作为 Configuration 的附加源。以上是关于ASP.NET Core 托管环境变量被忽略的主要内容,如果未能解决你的问题,请参考以下文章
如何使用环境变量覆盖 ASP.NET Core 配置数组设置