Я нашел, как получить адрес приложения.
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();