Получение базового URL-адреса приложения внутри ASP.NET Core HostedService - PullRequest
0 голосов
/ 25 ноября 2018

Мне нужно получить базовый URL-адрес приложения ASP.NET Core внутри одного из HostedServices.

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

На данный момент мое решение состоит в том, чтобы сохранить базовый URL в файле конфигурации или только в закрытой переменной размещенной службы.

https://github.com/BBGONE/JRIApp.Core/blob/master/DEMOS/RIAppDemoMVC/RIAppDemo/Utils/WarmUpService.cs

Но я думаю, что есть способ получить его из кода запуска, но я не знаю, где он спрятан.

Кто-нибудь знает, какего можно получить?

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

1 Ответ

0 голосов
/ 26 ноября 2018

Я нашел, как получить адрес приложения.

public void Configure(IApplicationBuilder application)
{
    var addresses = application.ServerFeatures.Get<IServerAddressesFeature>().Addresses;
}

Хотя он имеет проблему https://github.com/aspnet/Hosting/issues/811 и не может быть использован, если приложение размещено в IIS или IISЭкспресс.

Они говорят:

Это не будет работать для IIS или IIS Express.IIS работает как обратный прокси.Он выбирает случайный порт для прослушивания вашего процесса и не передает вам информацию об общедоступных адресах.Единственный способ получить информацию об общедоступных адресах - это поступающие запросы.

Базовый модуль ASP.NET генерирует динамический порт для назначения бэкэнд-процессу.CreateDefaultBuilder вызывает метод UseIISIntegration.UseIISIntegration настраивает Kestrel для прослушивания динамического порта по IP-адресу локального хоста (127.0.0.1).Если динамический порт 1234, Kestrel прослушивает 127.0.0.1:1234.Эта конфигурация заменяет другие конфигурации URL, предоставленные.

Но если вы получаете функцию из WebHost после ее сборки, то ее можно использовать для получения локального адреса для прогрева.

Iпопробовал так:

 public static void Main(string[] args)
 {
            var builder = CreateWebHostBuilder(args);
            var webHost = builder.Build();
            var addresses = webHost.ServerFeatures.Get<IServerAddressesFeature>().Addresses;
            var address = addresses.FirstOrDefault();
            AppDomain.CurrentDomain.SetData("BaseUrl", address?? "");
            webHost.Run();
  }

и получил локальный адрес Kestrel в WarmUpService следующим образом:

string baseUrl = AppDomain.CurrentDomain.GetData("BaseUrl").ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...