我的临时服务器上有两个网站,它们都是在 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();
}
正如这个类似的问题中所述,技巧就是简单地设置应用程序池来加载用户变量(IIS - >服务器 - >应用程序池 - >右键单击池 - >设置应用程序池默认值... - >加载用户配置文件 = True)。
我只相应配置了一个应用程序池,因此只有一个站点可以访问环境变量。
我刚刚花了最后几个小时处理同样的问题。我不确定结果是否相同,因为您似乎有两个应用程序之一正在运行。
我通过 Windows Server 2008 R2 上的“高级系统设置”将 ASPNETCORE_ENVIRONMENT 设置为“Staging”作为系统变量,并且始终处于“生产”环境(如果在任何地方都找不到设置,则这是默认环境) 。
在命令提示符中使用“set”显示“ASPNETCORE_ENVIRONMENT=Staging”的预期结果。
调用Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")返回null。我创建了另一个名为“Test”的变量,它也返回 null。调用任何其他现有变量都会返回预期结果。
我尝试回收应用程序池,更改应用程序池的用户,通过管理控制台重新启动 IIS,甚至重新启动万维网发布服务(可能与 IIS 管理控制台中的重置相同)都无济于事。
重新启动服务器是我能让应用程序返回预期结果的唯一方法。
如果您在 Visual Studio 中调试代码,请记住 Visual Studio 会缓存 Visual Studio 启动时存在的环境变量 - 而不是您点击“调试”时存在的环境变量!
因此,您可能必须重新启动 Visual Studio 才能看到对环境的任何更改。
从 cmd 窗口运行
net stop /y was && net start w3svc
。
来源:ASP.NET Core 文档 -> 在 ASP.NET Core 中使用多个环境 -> Windows - IIS 部署
注意:通过右键单击->停止->在 IIS 管理器中启动来重新启动 IIS 不起作用。
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();