Сохраните веб-сайт IIS ASP.NET быстро реагирующим, когда время между посещениями будет долго

Да, зона текущего времени кэшируется. На серьезном основании это избегает проблемы с поврежденным кодом, который использует DateTime. Теперь реализовать измерение прошедшего времени. Такой код имеет тенденцию переносить сердечный приступ, когда время внезапно изменяется на час или больше.

необходимо будет назвать Систему. Глобализация. CultureInfo. ClearCachedData () для сброса кэшируемого значения. Следующий вызов к DateTime. Теперь теперь даст новое местное время. При использовании.NET 3.5 класса TimeZoneInfo вообще тогда, необходимо будет также назвать его ClearCachedData () методом. Можно использовать SystemEvents. Событие TimeChanged как триггер.

11
задан Abel 3 November 2009 в 22:30
поделиться

3 ответа

Тайм-аут по умолчанию для IIS составляет 20 минут. Это означает, что если ваше приложение ASP.NET не получает никаких новых запросов в течение 20 минут, оно завершит рабочий процесс. Разогрев процесса с нуля может занять много времени - загрузка сборок в память, предварительная компиляция и т. Д.

( Правка : я собрал простой вспомогательный класс, который решает стандартную проблему тайм-аута - в основном веб-приложение время от времени "протыкает" себя, чтобы поддерживать процесс. Идеальный подход - изменить настройку в IIS, но для серверов, где это невозможно, мой класс работает достаточно хорошо. - Код на внизу )

Пока рабочий процесс еще жив, его не следует отменять. Конечно, не так быстро, как вы описываете. Возможно, вы полагаетесь на элементы, которые кэшируются в течение очень короткого периода времени и выпадают, когда они не запрашивались более нескольких секунд. Не зная подробностей о вашем приложении, невозможно сказать.

Как обычно, профилирование вашего приложения - единственный способ получить конкретную информацию. Использование такого продукта, как ANTS , поможет вам определить, где в коде ваше приложение тратит больше всего времени, чтобы вы могли определить, где происходит «зависание».

public class KeepAlive
{
     private static KeepAlive instance;
     private static object sync = new object();
     private string _applicationUrl;
     private string _cacheKey;

     private KeepAlive(string applicationUrl)
     {
         _applicationUrl = applicationUrl;
         _cacheKey = Guid.NewGuid().ToString();
         instance = this;
     }

     public static bool IsKeepingAlive
     {
         get
         {
             lock (sync)
             {
                 return instance != null;
             }
         }
     }

     public static void Start(string applicationUrl)
     {
         if(IsKeepingAlive)
         {
             return;
         }
         lock (sync)
         {
             instance = new KeepAlive(applicationUrl);
             instance.Insert();
         }
     }

     public static void Stop()
     {
         lock (sync)
         {
             HttpRuntime.Cache.Remove(instance._cacheKey);
             instance = null;
         }
     }

     private void Callback(string key, object value, CacheItemRemovedReason reason)
     {
         if (reason == CacheItemRemovedReason.Expired)
         {
             FetchApplicationUr();
             Insert();
         }
     }

     private void Insert()
     {
         HttpRuntime.Cache.Add(_cacheKey,
             this,
             null,
             Cache.NoAbsoluteExpiration,
             new TimeSpan(0, 10, 0),
             CacheItemPriority.Normal,
             this.Callback);
     }

     private void FetchApplicationUrl()
     {
         try
         {
             HttpWebRequest request = HttpWebRequest.Create(this._applicationUrl) as HttpWebRequest;
             using(HttpWebResponse response = request.GetResponse() as HttpWebResponse)
             {
                 HttpStatusCode status = response.StatusCode;
                 //log status
             }
         }
         catch (Exception ex)
         {
             //log exception
         }
     }
}

Использование (возможно, в App_Start):

KeepAlive.Start("http://www.yoursite.com/");
6
ответ дан 3 December 2019 в 11:04
поделиться

Если вы используете IIS 7, есть плагин IIS, вызывающий Application Warm Up от группы IIS, который поможет сохранить все в тонусе

Я написал сообщение в блоге о моем опыте его использования .

1
ответ дан 3 December 2019 в 11:04
поделиться

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

Обновление:

Пул приложений уничтожается при достижении значения IdleTime-Out - по умолчанию это 20 минут (это значение можно изменить). Вы уверены, что в этом случае пользовательский интерфейс не перекомпилируется после перезапуска приложения? (Я не уверен, заставляет ли он перекомпилировать пользовательский интерфейс или нет).

0
ответ дан 3 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: