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 &amp;&amp; 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学习——7

asp.net core环境变量详解

在 ASP.NET Core 中读取环境变量

如何使用环境变量覆盖 ASP.NET Core 配置数组设置

Asp.Net Core 入门—— 环境变量 TagHelper

ASP .NET CORE 根据环境变量支持多个 appsettings.json