Правильно внедрить конфигурацию в ядро ASP

#c# #asp.net-core #azure-service-fabric

#c# #asp.net-ядро #azure-service-fabric

Вопрос:

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

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();
            }))
    };
}
  

К измененной конфигурации в классе startup применяются конфигурации, такие как строка подключения и ведение журнала

введите описание изображения здесь

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

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

Обновить:

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

 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

Комментарии:

1. Если я понимаю ваш вопрос, вы считаете, что конфигурация должна быть введена в ApplicationInsights. Но это не так. Ваш описанный подход верен, смотрите Также Здесь: github.com/Microsoft/ApplicationInsights-aspnetcore/wiki /…

2. Само по себе это не связано с app.insight. Скорее, конфигурация, похоже, не улавливает ее. Например, мои настройки ведения журнала (не appinsight, а debug logger) не работают. редактировать: когда app insight работает должным образом, вам не нужно предоставлять ему конфигурацию, я заставил его работать с нашим приложением vanilla COre, когда оно не размещено в service fabric, просто вызвав AddApplicationInsightsTelemetry() с пустой сигнатурой метода

Ответ №1:

Шаблон проекта service fabric отличается от стандартного основного проекта.

Шаблон проекта Service fabric выполняет

 return new WebHostBuilder()
  

В то время как стандартный шаблон основного проекта выполняет

 WebHost.CreateDefaultBuilder(args)
  

Я предложил Microsoft унифицировать свои шаблоны проектов
https://github.com/microsoft/service-fabric/issues/319#issuecomment-486116026

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

https://github.com/microsoft/ApplicationInsights-aspnetcore/issues/867