使用 IISExpress 时,未在本地开发计算机上设置 ASP.NET Core 3.1 launchSettings.json 环境变量

Ale*_*xei 3 environment-variables iis-express asp.net-core asp.net-core-3.1

我偶然发现了 ASP.NET Core 3.1 应用程序的一个奇怪情况:launchSettings.json 中定义的environmentVariables 未设置(例如Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")is null)。

launchsettings.json 如下所示:

{
  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:60907",
      "sslPort": 44364
    }
  },
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger/index.html",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "MyApp.WebApi": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "swagger/index.html",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "https://localhost:5001;http://localhost:5000"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用IIS Express.

我调查过或尝试过的事情:

  1. 将项目拉到另一台机器上,它按预期工作:Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT""Development"

  2. 在同一台机器上运行一个非常相似的项目(几乎相同的配置)并且它按预期工作

  3. 删除了所有 launchsettings.json 内容,但IIS Express仍然存在相同的问题

  4. 使用另一个配置文件启动并且它按预期工作

  5. 关闭 Visual Studio -> 删除 .vs 文件夹 -> 重新打开 VS + 重新运行项目。问题仍然存在

  6. 重启机器,问题依旧

  7. 在配置文件中添加了其他环境变量,它们也被忽略

  8. 将工作项目与非工作项目 IISExpress applicationhost.config 文件进行比较,没有发现任何差异(项目路径除外)。

我现在唯一的解决方法是在 Program.cs 中进行本地更改并确保我永远不会提交它,但我正在寻找真正的修复方法:

string originalEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", originalEnv ?? "Development");
Run Code Online (Sandbox Code Playgroud)

我已经没有办法尝试了。我认为它与该特定应用程序的特定计算机上的 IIS Express 配置有关,但我找不到与环境变量相关的任何内容%userprofile%\My Documents\IISExpress\config\applicationhost.config

Cod*_*ter 7

您将操作系统的环境变量与 .NET Core 运行时环境混淆了。他们有相同的名字,一个可以晋升到另一个,但他们不一样。

launchSettings.json 中的环境变量(“运行时环境”“主机配置值”)不会提升为操作系统的实际环境变量,后者您可以通读Environment.GetEnvironmentVariable()

ASPNETCORE_ENVIRONMENT您可以通过IHostingEnvironment.Environment或阅读应用程序的内容IWebHostEnvironment.EnvironmentName

回顾一下:您不应该使用从操作系统的环境变量中Environment.GetEnvironmentVariable()读取,因为.NET Core 环境可以通过不同的方式设置。ASPNETCORE_ENVIRONMENT

相反:在主机初始化期间,ASPNETCORE_ENVIRONMENT环境变量是从操作系统读取的,但是可以通过不同的方式提供该值,即通过 launchSettings.json、.vscode/launch.json 或者甚至可以使用AddCommandLine(args),进而:

dotnet run --environment "Staging"
Run Code Online (Sandbox Code Playgroud)

并且您Environment.GetEnvironmentVariable()将报告错误的值(如果有)。