【问题标题】:Why NET Core 3.1 BackgroundWorker in ubuntu can't access environment variables?为什么ubuntu中的NET Core 3.1 BackgroundWorker不能访问环境变量?
【发布时间】:2020-05-12 12:35:16
【问题描述】:

我有一个 .net core 3.1 后台工作程序,它作为后台工作程序安装在 ubuntu 中。但它无法获得多重配置所需的环境变量的值,这就是为什么您可以看到主机环境的值是默认值,即生产环境。

我已经尝试通过 hostenvironment.environmentname 和 Environment.GetEnvironmentVariable 获取它。

我的服务文件在 /etc/systemd/

[Unit]
Description=TestService

[Service]
Type=notify
WorkingDirectory=/home/centos/TestService/
ExecStart=/usr/bin/dotnet /home/centos/TestService/WorkerService2.dll
User=centos

[Install]
WantedBy=multi-user.target

NET Core 3.1 后台工作者中的代码。

 _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            _logger.LogError("ERROR testing");
            _logger.LogInformation($"Hosting Enviornment: {_hostEnvironment.EnvironmentName}");
            _logger.LogInformation(_configuration["Test"]);
            var basePath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
            var contentroothpath = _hostEnvironment.ContentRootPath;

            Console.WriteLine($"basepath = {basePath}");
            Console.WriteLine($"contentrootpath = {contentroothpath}");
            _logger.LogInformation($"basepath = {basePath}");
            _logger.LogInformation($"contentrootpath = {contentroothpath}");



            var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
            var environmentName2 = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");

            _logger.LogInformation($"ASPNETCORE_ENVIRONMENT = {environmentName}");
            _logger.LogInformation($"DOTNET_ENVIRONMENT = {environmentName2}");

在 cmd 上输出。

program.cs 中的代码

 public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseSystemd()
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
                var basePath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
                //NLog.LogManager.LoadConfiguration($"{basePath}/NLog.{hostContext.HostingEnvironment.ContentRootPath}.config");
            })
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile(
                    $"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);
                //NLog.LogManager.LoadConfiguration($"/home/centos/TestService/{hostingContext.HostingEnvironment.EnvironmentName}.config");
                //NLog.LogManager.LoadConfiguration($"{basePath}" +
                //    $"/NLog.{hostingContext.HostingEnvironment.EnvironmentName}.config");
            });

【问题讨论】:

    标签: c# linux environment-variables backgroundworker .net-core-3.0


    【解决方案1】:

    我已经知道了。我在 .Service 文件上添加了 Environment=DOTNET_ENVIRONMENT=Development。

    【讨论】:

      【解决方案2】:

      您需要在 Main() 中访问 HostBuilderContext 才能访问类似这样的托管环境

       CreateHostBuilder(args)
                  .ConfigureAppConfiguration((hostingContext, config) =>
                  {
                      var env = hostingContext.HostingEnvironment;
                      config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
      
                      if (env.IsDevelopment() || env.EnvironmentName.ToLower() == "dev")
                          config.AddJsonFile("appsettings.dev.json", optional: true, reloadOnChange: true);
                      else if (env.IsStaging() || env.EnvironmentName.ToLower() == "stage")
                          config.AddJsonFile("appsettings.stage.json", optional: true, reloadOnChange: true);                    
      
                      config.AddEnvironmentVariables();
                  }).Build().Run();
      

      另外,别忘了添加 environmentVariables

      • 在项目属性的launchSettings.json中
      • 在 linux 上,使用命令 setx ASPNETCORE_ENVIRONMENT "Development" 并使用 echo ASPNETCORE_ENVIRONMENT 检查环境设置是否正确

      {
        "iisSettings": {
          "windowsAuthentication": false,
          "anonymousAuthentication": true,
          "iisExpress": {
            "applicationUrl": "http://localhost:57993/",
            "sslPort": 0
          }
        },
        "profiles": {
          "IIS Express": {
            "commandName": "IISExpress",
            "launchBrowser": true,
            "environmentVariables": {
              "ASPNETCORE_ENVIRONMENT": "Development"
            }
          }
        }
      }

      【讨论】:

      • 嗨@bambamdeo,对不起,我编辑了我的帖子并将代码放入程序中。我已经在 program.cs 中进行了配置。问题是环境始终处于生产状态(默认),因为我的后台工作人员正在访问环境变量,但值为 null 或空。
      • 那是因为launchSettings.json的配置文件中没有环境设置,我在帖子中添加
      • launchsettings.json 仅在我在 Visual Studio 上运行时才有效我不在 Visual Studio 上运行它。我已经在 ubuntu 上安装了后台工作程序并设置了环境变量。截图是在 ubuntu 的 cmd 上截的。
      • 哦,你试过这个吗:setx ASPNETCORE_ENVIRONMENT "Development",我在这里找到了andrewlock.net/…
      • 是的。 ASPNETCORE_ENVIRONMENT 设置为暂存。如果 ASPNETCORE_ENVIRONMENT 不是 ASP.NET Core,那么它可能不是后台工作人员的关键?它只是 .NET Core。我已经导出 DOTNET_ENVIRONMENT=Development 但值为空。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多