ASP.NET Ядро (Blazor) Загрузка конфигурации, специфичной для клиента, при запуске с помощью URL или виртуального пути

#asp.net-core #iis #startup #blazor-server-side

#asp.net-core #iis #запуск #blazor-на стороне сервера

Вопрос:

Наше приложение (серверный Blazor в .NET Core 3.1) выполняется в IIS на сервере Windows. У нас есть несколько сайтов в IIS, на которых запущено одно и то же приложение, но с разными URL-адресами для разных клиентов.

При запуске в (ConfigureServices) мы хотим загрузить конфигурацию клиента для приложения из файла конфигурации. Таким образом, у нас может быть несколько экземпляров приложения, запущенных с разными конфигурациями. Загрузка этой информации из базы данных невозможна, поскольку конфигурация содержит сведения для подключения к базе данных.

В ASP.NET Фреймворк у нас будет доступ к виртуальному пути или (дополнительному) доменному имени в глобальном, а затем мы загрузим конфигурацию на основе этой информации.

Нам нужен такой же доступ в нашем ASP.Net Основные приложения или другой обходной путь. Есть ли что-нибудь для достижения того же результата?

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

1. Поскольку они выполняются в разных пулах приложений, вы можете установить разные значения для одной и той же переменной среды (предположим POOLNAME ) в конфигурации пула приложений IIS, а затем прочитать это в своем коде.

2. Какую конфигурацию клиента вы хотите загрузить для приложения? Если это может быть реализовано в asp.net фреймворк, он также может быть реализован в asp.net ядро.

3. Мы загружаем различные настройки, среди прочего, сведения о подключении к базе данных. Но самая важная часть — это знание того, на каком сайте запущено приложение.

Ответ №1:

Лучший способ различать сайты по URL. Имя домена и порт, привязанные к каждому сайту в IIS, не будут повторяться.

Вы можете обратиться к этому коду, чтобы получить URL-адрес в startup.cs.

   public void Configure(IApplicationBuilder app, IWebHostEnvironment env,IHostApplicationLifetime lifetime,IServiceProvider serviceProvider)
    {
        ...other code...

        lifetime.ApplicationStarted.Register(
            () => logAddresses(app.ServerFeatures));
    }

  static void logAddresses(IFeatureCollection features)
        {
            var addressFeature = features.Get<IServerAddressesFeature>();
            if (addressFeature != null)
            {
                foreach(var address in addressFeature.Addresses)
                {
                    Console.Out.WriteLine(address);
                }
            }
        }
  

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

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

1. Я ищу доступ к этой информации из метода ConfigureServices.

2. Если вы хотите получить доступ к информации из ConfigureServices, вы можете использовать web.administrator . learn.microsoft.com/en-us/iis/manage/scripting /…

3. Да, но это добавило бы ненужные библиотеки в проект. И я все равно не знаю, на каком сайте находится приложение

4. Разные веб-сайты привязывают разные URL-адреса и порты, почему вы не можете узнать, какой сайт является целевым приложением?

5. Не зная никаких подробностей о сайте, было бы невозможно выбрать этот сайт из списка

Ответ №2:

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

 var appPool = Environment.GetEnvironmentVariable( "APP_POOL_ID", EnvironmentVariableTarget.Process )
van sectionname = SomeMagicToParseAppPool( appPool );            
var config = Configuration.GetSection( sectionName );
if ( config == null ) throw new ApplicationException($" Cannot find config section for {host}");
services.Configure<ApplicationSettings>( config );
  

Это позволяет мне загружать другую конфигурацию для другого сайта. Единственным недостатком является то, что для каждого приложения требуется собственный пул приложений. Но это уже было требованием из-за .NET Core ASP.NET приложение должно запускаться неуправляемым в пуле приложений.