Внедрить конфигурацию в ASP Core правильно - PullRequest
2 голосов
/ 09 апреля 2019

Мы размещаем веб-API ASP Core внутри экземпляра сервисной фабрики.Я хочу переслать все конфиги в приложение Core.Я использую этот метод

https://dzimchuk.net/configuring-asp-net-core-applications-in-service-fabric/

И затем я вызываю его, используя ConfigureAppConfiguration

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    return new[]
    {
        new ServiceInstanceListener(serviceContext =>
            new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
            {
                ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");

                return new WebHostBuilder()
                            .UseKestrel()
                            .ConfigureServices(
                                services => services.AddSingleton(serviceContext))
                            .ConfigureAppConfiguration(builder => builder.AddServiceFabricConfiguration(serviceContext))
                            .UseContentRoot(Directory.GetCurrentDirectory())
                            .UseStartup<Startup>()
                            .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseReverseProxyIntegration)
                            .UseUrls(url)
                            .Build();
            }))
    };
}

Для неконфигурированной конфигурации в классе запуска действительно применяются конфиги, например:Строка подключения и протоколирование

enter image description here

Но, похоже, он не полностью вставлен в каркас.

Например, мне нужно явно указать ApplicationInsights с конфигурацией services.AddApplicationInsightsTelemetry(Configuration);, в противном случае он не получает ключ инструмента.И регистрация не работает (уровень журнала не применяется).

Обновление:

Я попытался создать провайдера нестандартной конфигурации в стандартном базовом проекте без сервисной фабрики, и он работает.

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration(builder => builder.AddServiceFabricConfiguration())
            .UseStartup<Startup>();
}

internal class ServiceFabricConfigurationProvider : ConfigurationProvider
{

    public override void Load()
    {
        Data["Logging:Debug:LogLevel:Default"] = "Information";
    }
}

internal class ServiceFabricConfigurationSource : IConfigurationSource
{


    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new ServiceFabricConfigurationProvider();
    }
}

public static class ServiceFabricConfigurationExtensions
{
    public static IConfigurationBuilder AddServiceFabricConfiguration(this IConfigurationBuilder builder)
    {
        builder.Add(new ServiceFabricConfigurationSource());
        return builder;
    }
}

Так что, кажется, что-то, что я обслуживаю, ткань не работает должным образом.

редактировать: проект Repro https://github.com/AndersMalmgren/ServiceFabricLoggingRepro

...