如何配置 program.cs 以选择 appsettings.[EnvironmentName].json

问题描述 投票:0回答:2

我有一个 .net core 6.0 项目,我正在其中部署后台服务。

我有

appsettings.test.json

appsettings.staging.json

appsettings.json

每个配置连接到不同的持久层。

此外,每个应用程序洞察都有不同的检测密钥。

我可以获得要部署的测试或暂存环境中的任何一个,但随后其他应用程序洞察力将停止运行。

(我试图在部署时复制 launchSetting.json 文件。它从未被覆盖)

但是我如何确保我在我的 azure 服务中定义的环境变量在我的 program.cs 文件中被拾取? 当代码部署到 Azure 并启动时,我如何调试实际选择的环境?

我的程序.cs文件:

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((hostServices, services) =>
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(hostServices.HostingEnvironment.ContentRootPath)
            .AddJsonFile($"appsettings.{hostServices.HostingEnvironment.EnvironmentName}.json", optional: false, reloadOnChange: true);
            
        var configuration = builder.Build();

        services.AddLogging();
        services.AddHostedService<Worker>();
        
        var aiOptions = new ApplicationInsightsServiceOptions
        {
            // Disables adaptive sampling.
            EnableAdaptiveSampling = false,
            // Disables QuickPulse (Live Metrics stream).
            EnableQuickPulseMetricStream = true
        };
        
        services.AddApplicationInsightsTelemetryWorkerService(aiOptions);
        ..........
);

我还添加了一个变量:ASPNETCORE_ENVIRONMENT 在我的测试资源上使用值“测试”。

staging中也添加了相应的配置,但取而代之的是“staging”

但是我的环境变量似乎没有使用这些特定值?我该怎么做?

编辑:

我现在已经改变了工人服务项目,包含在一个“正常”的 Web 应用程序项目中,这允许我在 Web 应用程序中托管工人服务,这解决了我的即时问题,有时工人服务没有开始吧

但是,环境变量问题依然存在。 我仍然只能部署“lauchsettings.json”文件中的任何内容,该文件的内容永远不会被 azure 配置覆盖,因此无论在源代码中选择什么环境,都会部署到所有三个节点。

必须有更好的方法来调试此类错误,而不是“运行一个网站来确认所选环境的价值”,这对于像这样的系统上至关重要的东西来说太疯狂了?

c# azure-application-insights
2个回答
0
投票

除了@Guru Stron Answer.

但是我如何确保我在我的 azure 服务中定义的环境变量在我的 program.cs 文件中被拾取?

Program.cs
文件中添加以下代码。

var builder = WebApplication.CreateBuilder(args);
var env = builder.Environment.EnvironmentName;
IConfigurationBuilder myconfig = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", true)
    .AddJsonFile($"appsettings.{env}.json", true)
    .AddEnvironmentVariables();

我们可以显示示例值并检查显示的是哪个环境值。

检查以下解决方法以根据环境从

appsettings.json
加载值。

  • 我在这里设置所有
    appsettings
    文件中的值。

例子:

 Test Env: "values": "From Test Environment"
 Devel Env: "values": "Value from Development Environment"
 Production Env: "values": "From Production Environment"
  • 当您尝试从
    test
    环境中访问值时,我将
    ASPNETCORE_ENVIRONMENT
    设置为
    Azure App Settings
    中的测试。

 .cshtml
文件中,

@inject IConfiguration myconfig
<h2>@myconfig["Values"]</h2>

enter image description here

输出: enter image description here

更新:

Worker.cs
文件中, 添加以下代码行。

        public IConfiguration _config;
        public Worker(ILogger<Worker> logger,IConfiguration config)
        {
            _logger = logger;
            _config = config;
        }
          protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                //var env = config.GetValue<string>("Values");
                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                _logger.LogInformation(_config.GetValue<string>("Values"));
                await Task.Delay(1000, stoppingToken);
            }
        }

您也可以通过设置 Environmnet 变量在本地进行检查。

enter image description here

enter image description here

输出: enter image description here


-1
投票

不是答案(至少是一个完整的答案)但值得注意 - 默认构建器设置应该已经通过环境处理处理标准应用程序设置:

  • ...
  • 从以下位置加载应用配置:
    • appsettings.json.
    • appsettings.{Environment}.json.
  • ...

尝试使用上下文中的配置而不是构建自己的配置:

var configuration = hostServices.Configuration;
© www.soinside.com 2019 - 2024. All rights reserved.