Я тут наколхозил по теме и хочется чегото более универсального.
И оказалось что вещь полезная, особенно на шаред-виртуальке или при нехватке памяти один раз у меня корневая урла минуту джиттилась
Ниже сама простая реализация.
Вопрос в том как бы сделать более универсально. Имеется ввиду вот что — не хочется выдумывать весь список урлов который покроет все контроллеры и вьюхи.
Где то в Program.Main запоминаем все сконфигурированные хост-адреса. Они будут нужны потом когда Хост запустится.
public static readonly List<string> Addresses = new List<string>();
public static void Main(string[] args)
{
var host = BuildWebHost(args);
try
{
var adresses = host.ServerFeatures.Get<IServerAddressesFeature>().Addresses;
Addresses.AddRange(adresses.Select(x => x.Replace("://+", "://localhost").Replace("://0.0.0.0", "://localhost")));
}
catch(Exception ex)
{
Console.WriteLine("Oops: " + ex.GetExceptionDigest());
}
host.Run();
}
Где-то вконце Startup() дергаем нужные урлы. Для упрощения только одну урл реквестим — корневую.
ThreadPool.QueueUserWorkItem(_ =>
{
// Даем 2 секунды что бы host.Run() "запустился", к счатью он всегда моментально выполняется.
Thread.Sleep(2000);
var httpHost = Program.Addresses.FirstOrDefault() ?? "http://localhost:5000";
Stopwatch startAt = Stopwatch.StartNew();
try
{
HttpClient c = new HttpClient();
var bytes = c.GetByteArrayAsync(httpHost).Result;
_StartUpLogger.LogInformation($"Pre-JITed [{httpHost}] in {startAt.Elapsed}");
}
catch(Exception ex)
{
_StartUpLogger.LogWarning($"Pre-JIT [{httpHost}] failed. " + ex.GetExceptionDigest());
}
});