Lar*_*rry 8 c# console-application .net-6.0
一直在开发一个向 VBA 应用程序提供数据的应用程序。现在尝试获取配置文件(appsettings.json 和 appsettings.Development.Json)。现在它是一个 .net6.0 控制台应用程序,稍后我将其设为 IconTrayApp。
遇到问题,主 Program.cs 方法获取 appsettings.json,而工作线程获取 appssettings.Developement.json。我明白为什么 Main() 得到无环境 json,因为我显式加载它。但我希望应用程序在 IDE 中和外部使用相同的文件。
这是program.cs
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using PostDataService.InterfaceModels;
using Serilog;
using Serilog.Events;
using System;
namespace PostDataService
{
public class Program
{
public static void Main(string[] args)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
IConfiguration config = builder.Build();
string _logFQN = config["PostConfig:Basefolder"] + config["PostConfig:LogsFolder"] + config["PostConfig:LogFname"];
string _LogTemplate = config["PostConfig:LogTemplate"];
var loggerConfig = new LoggerConfiguration()
.MinimumLevel.Override("Microsoft", LogEventLevel.Verbose)
.Enrich.FromLogContext()
.Enrich.WithThreadId()
.Enrich.WithEnvironmentUserName()
.WriteTo.File(_logFQN,
fileSizeLimitBytes: 524288000,
rollOnFileSizeLimit: true,
rollingInterval: RollingInterval.Day,
outputTemplate: _LogTemplate);
Log.Logger = loggerConfig.CreateLogger();
try
{
Log.Write(LogEventLevel.Information, "Start USPS Data Server");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
Log.Information("USPS Server stopped");
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureServices((hostContext, services) =>
{
IConfiguration configuration = hostContext.Configuration;
WorkerOptions options = configuration.GetSection("PostConfig").Get<WorkerOptions>();
services.AddSingleton(options);
services.AddHostedService<Worker>();
});
}
}
Run Code Online (Sandbox Code Playgroud)
这是appsettings.json(appsettings.Development.json)
{
"PostConfig": {
"BaseFolder": "./App_Data/",
"LogsFolder": "logs/",
"SystemFQN": "C:/Test/PostalDB/PostalData.db",
"CustFQN": "C:/Test/PostalDB/PostalCustomer.db",
"LogFname": "USPS_.log",
"LogTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff}\t{EnvironmentUserName}\t[{Level:u4}]\t<{ThreadId}>\t{Message:lj}{NewLine}{Exception}"
}
}
Run Code Online (Sandbox Code Playgroud)
我确实尝试在配置生成器中使用 .AddEnvironmentVariables() ,但这似乎没有改变任何事情。我怀疑是因为显式的 addjsonfile 调用。
我可能有点不清楚,Worker 获取 appsettings.Development.json 文件,当我在 VS 中运行时,该文件是正确的。我正在寻找一种在 Main() 方法中获得相同行为的干净方法。
我采纳了 Guru Stron 的评论,并强制其包含 appsettings.dev... 文件,如下所示:
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environments.Development}.json", optional: true, reloadOnChange: true);
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常,只是感觉我正在硬编码一些应该被烘焙的东西。
此外,如果我从 Windows 文件资源管理器运行应用程序,我会在主文件中获得 appsettings.developement.json 值,但在工作类中获得 appsettings.json 值。这是有意义的,因为文件 appsettings.development.json 会根据构建器调用覆盖 appsettings.json。不理想。