【问题标题】:.NET Core 3.1 Environment not correct.NET Core 3.1 环境不正确
【发布时间】:2020-07-23 17:52:44
【问题描述】:

我有一个 .NET Core 3.1 Web API,我最近推送到开发 Azure VM 以在 IIS 上运行。部署 API 后,我注意到应用程序没有启动,我什至没有得到详细的 IIS 堆栈跟踪,只是一个简单的 404 错误。于是我检查了 Windows 事件查看器,发现如下:

System.ArgumentNullException: Value cannot be null. (Parameter 'connectionString')
   at Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty(String value, String parameterName)

connectionString 键只存在于我的 appsettings.Development.json 中。我突然想到将连接字符串添加到我的 appsettings.json 并且错误消失了。但我想为我的开发环境使用不同的数据库连接字符串。所以我知道你们现在在想什么,所以我继续检查/确认服务器上的环境变量:

C:\windows\system32>reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
    ASPNETCORE_ENVIRONMENT    REG_SZ    Development
    ComSpec    REG_EXPAND_SZ    %SystemRoot%\system32\cmd.exe

所以我继续在我的 Startup 中添加以下内容:

       public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger)
        {
            var connstr = Configuration.GetConnectionString("MyDbContext");

            logger.LogInformation($"ApplicationName: {env.ApplicationName}");
            logger.LogInformation($"EnvironmentName: {env.EnvironmentName}");
            logger.LogInformation($"ContentRootPath: {env.ContentRootPath}");
            logger.LogInformation($"WebRootPath: {env.WebRootPath}");
            logger.LogInformation($"DbConnection: {connstr}");

并检查了我的标准输出日志:

info: MyProject.API.Startup[0]
      ApplicationName: MyProject.API
info: MyProject.API.Startup[0]
      EnvironmentName: Production
info: MyProject.API.Startup[0]
      ContentRootPath: C:\inetpub\wwwroot\myapi
info: MyProject.API.Startup[0]
      WebRootPath: 
info: MyProject.API.Startup[0]
      DbConnection: <my connection string from appsettings.json>

所以我不明白这是 .NET Core 3.1 的一些新变化,还是我的 API 没有将 ASPNETCORE_ENVIRONMENT 变量检测为 Development。

【问题讨论】:

    标签: c# .net-core entity-framework-core


    【解决方案1】:

    只有桌面程序才能在不重新启动的情况下获取系统环境变量更改。

    进程从它们的父进程继承环境变量,只有 Explorer(shell)监听注册表的变化,并在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 发生变化时重新加载其环境变量。然后从 Explorer 启动的任何新进程都将继承更改的环境变量。

    服务(如 IIS)不会,甚至 IISRESET 或回收应用程序池也无济于事。您必须重新启动。

    【讨论】:

    • 感谢您的回复。我从来没有想过要硬重启,因为我是从头开始设置这个虚拟机的,很可能自从我部署应用程序以来它可能从未重启过。我明天会尝试这样做,希望能解决它。
    【解决方案2】:

    ASP.NET Core 使用的算法在Use multiple environments in ASP.NET Core 中有描述:

    为了确定运行时环境,ASP.NET Core 从以下环境变量中读取:

    1. DOTNET_ENVIRONMENT
    2. ASPNETCORE_ENVIRONMENTConfigureWebHostDefaults 被调用时。默认的 ASP.NET Core Web 应用模板调用 ConfigureWebHostDefaultsASPNETCORE_ENVIRONMENT 值会覆盖 DOTNET_ENVIRONMENT

    IHostEnvironment.EnvironmentName 可以设置为任意值,但以下值由框架提供:

    • DevelopmentlaunchSettings.json 文件将 ASPNETCORE_ENVIRONMENT 设置为本地计算机上的 Development。
    • Staging
    • Production:如果 DOTNET_ENVIRONMENTASPNETCORE_ENVIRONMENT 尚未设置,则为默认值。

    同时确保在设置环境变量后重新加载 IIS 进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-10
      • 2019-08-29
      • 2018-07-04
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      相关资源
      最近更新 更多