【问题标题】:ASP.NET Core hosting environment variable ignoredASP.NET Core 托管环境变量被忽略
【发布时间】: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 直接在控制台上独立启动时。

标签: asp.net-core 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 的附加源。
    猜你喜欢
    • 2021-10-15
    • 2021-08-05
    • 2019-08-13
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2019-03-03
    • 2021-02-13
    相关资源
    最近更新 更多