我有一个 .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 配置覆盖,因此无论在源代码中选择什么环境,都会部署到所有三个节点。
必须有更好的方法来调试此类错误,而不是“运行一个网站来确认所选环境的价值”,这对于像这样的系统上至关重要的东西来说太疯狂了?
除了@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>
输出:
在
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 变量在本地进行检查。
输出:
不是答案(至少是一个完整的答案)但值得注意 - 默认构建器设置应该已经通过环境处理处理标准应用程序设置:
- ...
- 从以下位置加载应用配置:
- appsettings.json.
- appsettings.{Environment}.json.
- ...
尝试使用上下文中的配置而不是构建自己的配置:
var configuration = hostServices.Configuration;