为什么ubuntu中的NET Core 3.1 BackgroundWorker无法访问环境变量?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么ubuntu中的NET Core 3.1 BackgroundWorker无法访问环境变量?相关的知识,希望对你有一定的参考价值。

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

我已经尝试通过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输出。

enter image description hereenter image description here

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");
            );
答案

您将需要在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();

以上是关于为什么ubuntu中的NET Core 3.1 BackgroundWorker无法访问环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥从 .net core 3.1 迁移到 .net 5 时 JSON 返回值发生了变化

HTTP 错误 500.0 - Dot net core 3.1 中的 ASP.NET Core IIS 托管失败(进程中)

.NET Core 3.1 中的 Linq 表达式 GroupBy 错误

如何在 ASP.NET Core 3.1 的另一个应用程序中包含用户管理器

.NET Core 3.1 中的依赖注入具有多种实现 [重复]

忽略 ASP.NET Core 3.1 中的 WCF 证书错误