25.11.2017 Core: Заджиттим контроллеры и вьюхи
 
Я тут наколхозил по теме и хочется чегото более универсального.

И оказалось что вещь полезная, особенно на шаред-виртуальке или при нехватке памяти один раз у меня корневая урла минуту джиттилась

Ниже сама простая реализация.

Вопрос в том как бы сделать более универсально. Имеется ввиду вот что — не хочется выдумывать весь список урлов который покроет все контроллеры и вьюхи.

Где то в 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());
    }
});