ASP.NET Core 3 Ошибки регистрации при запуске контроллера

Я пытаюсь запустить службу API в ASP.NET Core 3 с ведением журнала, но постоянно получаю сообщение об ошибке при попытке получить ILogger из службы зависимостей. Я думаю, что следовал примерам, которые я могу найти, но я продолжаю получать:

"System.InvalidOperationException: "Не удалось разрешить службу для типа" Microsoft.Extensions.Logging.ILogger`1[GMT.Beacon.Service.Startup]" при попытке активировать "GMT.Beacon.Service.Startup".

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

Вот класс Program.cs с ошибкой:

public class Program { 
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder => {
                webBuilder.UseStartup<Startup>();
            });

    public static void Main(string[] args) {
        var host = CreateHostBuilder(args).Build();
        var logger = host.Services.GetRequiredService<ILogger<Program>>();
        logger.LogInformation("Test log entry.");
        host.Run();
    }
}

В классе Startup.cs вот конструктор:

public Startup(IConfiguration config, IHostEnvironment hosting, ILogger<Startup> logger) {
    _hosting = hosting;
    _config = config;
    _logger = logger;

    _logger.LogInformation($"{DateTime.UtcNow:R} - Starting (Environment={_hosting.EnvironmentName}; " + $"InformationalVersion={Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion};");
}

Основываясь на документации, которую я могу найти, кажется, что это должно работать, но вместо этого выдает указанную выше ошибку в строке:

var host = CreateHostBuilder(args).Build();

Я также пытался вручную настроить ведение журнала (с приведенным ниже кодом), но это возвращает ту же ошибку.

Host.CreateDefaultBuilder(args)
    .ConfigureLogging((hostingContext, logging) => {
        logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
        logging.AddEventSourceLogger();
        logging.AddConsole();
        logging.AddDebug();
    })
    .ConfigureWebHostDefaults(webBuilder => {
        webBuilder.UseStartup<Startup>();
    });

Кто-нибудь видит проблему с этой настройкой или знает, как правильно настроить подсистему ведения журнала в ASP.NET Core 3?


person Jerry Esch    schedule 22.07.2019    source источник


Ответы (2)


Это то, что изменилось в ASP.NET Core 3. См. объявление здесь:

TLDR: Единственные типы, которые универсальный хост поддерживает для внедрения конструктора запуска, — это IHostEnvironment, IWebHostEnvironment и IConfiguration. Приложения, использующие WebHost, не затрагиваются.

ILogger<T> можно внедрить в Configure, поэтому вы можете получить к нему доступ оттуда, чтобы зарегистрировать свое стартовое сообщение:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILogger<Startup> logger)
{
    logger.LogInformation(...);

    // ...
}
person Kirk Larkin    schedule 22.07.2019

В ASP.NET Core 2.x ведение журнала создается в построителе узлов. Это означает, что ведение журнала доступно через DI по умолчанию и может быть внедрено в класс Startup:

public class Startup
{
    private readonly ILogger<Startup> _logger;


    public Startup(ILogger<Startup> logger, IConfiguration configuration)
    {
        _logger = logger;
        Configuration = configuration;
    }

}
person Sandeep Sing Gangwar    schedule 22.07.2019