Начать запись перед webhost в ASP.NET Core 2 - PullRequest
0 голосов
/ 27 августа 2018

Я хочу начать регистрацию перед веб-хостом, чтобы регистрировались ошибки запуска. Поэтому я следовал рекомендованному порядку инициализации Serilog : 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();

Это работает, но изменения в appsettings.json не обнаруживаются, хотя я указал reloadOnChange:true.

Однако, когда я использую ConfigureAppConfiguration(), тогда обнаруживаются изменения:

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

Но это означает дублирование и, возможно, непредвиденные проблемы - то есть это взлом. Как мне решить эту проблему?

UPDATE

Согласно ответу @ StephenZeng, UseConfiguration мне здесь не поможет, поэтому я полагаю, что мне нужно использовать ConfigureAppConfiguration. Но проблема остается: как мне сначала запустить мой конфиг, а затем использовать его несколько раз, не переопределяя его?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Я столкнулся с той же проблемой и создал метод, отвечающий за настройку компоновщика. Затем я вызываю метод как из Main, так и при создании веб-хостинга. Как то так:

public static class Program
{
  public static int Main()
  {
    var configuration = new ConfigurationBuilder()
      .AddConfiguration()
      .Build();

    // setup Serilog logging
    Log.Logger = new LoggerConfiguration()
      .ReadFrom.Configuration(configuration)
      .CreateLogger();

    // Code removed for brevity...
  }

  private static IWebHost BuildWebHost() =>
    WebHost.CreateDefaultBuilder()
      .UseSerilog()
      .UseStartup<Startup>()
      .ConfigureAppConfiguration((hostingContext, config) =>
      {
        // Clear default configuration
        config.Sources.Clear();

        // Replace with our own configuration
        config.AddConfiguration();
      })
      .Build();

  private static IConfigurationBuilder AddConfiguration(this IConfigurationBuilder self) =>
    self
      .SetBasePath(Directory.GetCurrentDirectory())
      .AddJsonFile("appsettings.json", optional:false, reloadOnChange:true)
      .AddJsonFile($"appsettings.{envName}.json", optional:true, reloadOnChange:true)
      .AddEnvironmentVariables();
}
0 голосов
/ 28 августа 2018

Решение состоит в том, чтобы избежать UseConfiguration и использовать вместо него ConfigureAppConfiguration:

// setup config
// ..as before
// ..this is done only once

// setup Serilog logging
// ...as before

// setup webhost
new WebHostBuilder()
  .ConfigureAppConfiguration((context, config) => {
    config.AddConfiguration(configuration);  // <<< uses config from above
  })
  .UseKestrel()
  .UseContentRoot(Directory.GetCurrentDirectory())
  .UseStartup<Startup>()
  .UseSerilog()
  .Build()
  .Run();
0 голосов
/ 27 августа 2018

Из документа оформлено:

"UseConfiguration копирует только ключи из предоставленной IConfiguration в конфигурацию компоновщика хоста. Поэтому установка reloadOnChange: true для файлов настроек JSON, INI и XML не оказывает никакого влияния."

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

...