#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 приложение должно запускаться неуправляемым в пуле приложений.