Skip to main content
 首页 » 编程设计

c#之在 ASP.NET Core 2 中的 webhost 之前开始记录

2024年02月04日34itcoder

我想在 webhost 之前开始记录,所以记录了启动错误。所以我关注了Serilog's recommended init order : 1) 配置,2) 日志记录,3) 虚拟主机。我没有使用 CreateDefaultBuilder()。

所以我的 Program.cs 有:

// setup config 
var envName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"; 
var configuration = new ConfigurationBuilder() 
  .SetBasePath(Directory.GetCurrentDirectory()) 
  .AddJsonFile("appsettings.json", optional:false, reloadOnChange:true) 
  .AddJsonFile($"appsettings.{envName}.json", optional:true, reloadOnChange:true) 
  .AddEnvironmentVariables() 
  .AddCommandLine(args) 
  .Build(); 
 
// setup Serilog logging 
Log.Logger = new LoggerConfiguration() 
  .ReadFrom.Configuration(configuration)            // <<< uses config from above 
  .CreateLogger() 
 
// setup webhost 
new WebHostBuilder() 
  .UseConfiguration(configuration)                  // <<< uses config from above 
  .UseKestrel() 
  .UseContentRoot(Directory.GetCurrentDirectory()) 
  .UseStartup<Startup>() 
  .UseSerilog() 
  .Build() 
  .Run(); 

这有效,但即使我指定了 reloadOnChange:true,也未检测到 appsettings.json 中的更改。

但是,当我使用 ConfigureAppConfiguration() 时,会检测到更改:

new WebHostBuilder() 
  .ConfigureAppConfiguration((context, config) => { 
    // .. duplicate config here 
  }) 
  .UseKestrel() 
  .UseContentRoot(Directory.GetCurrentDirectory()) 
  .UseStartup<Startup>() 
  .UseSerilog() 
  .Build() 
  .Run(); 

但这意味着重复和可能无法预料的问题 - 即这是一个 hack。我该如何解决这个问题?

更新

根据@StephenZeng 的回答,UseConfiguration 在这里帮不了我,所以我想我需要使用 ConfigureAppConfiguration。但问题仍然存在 - 我如何先初始化我的配置,然后多次使用它而不重新定义它?

请您参考如下方法:

根据文档,它是设计使然:

“UseConfiguration 仅将提供的 IConfiguration 中的 key 复制到主机构建器配置。因此,为 JSON、INI 和 XML 设置文件设置 reloadOnChange: true 无效。”

https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/web-host?view=aspnetcore-2.1&tabs=aspnetcore2x