El tiempo de espera predeterminado para IIS es de 20 minutos. Lo que esto significa es que si su aplicación ASP.NET no recibe ninguna solicitud nueva durante 20 minutos, se cerrará el proceso de trabajo. Se puede tomar una cantidad considerable de tiempo para calentar el proceso de la nada - asambleas de carga en la memoria, la compilación previa, etc.
(Edición: he creado una clase de ayuda simple que resuelve el problema de tiempo de espera estándar - básicamente el la aplicación web "pincha" a sí misma de vez en cuando para mantener vivo el proceso. El enfoque ideal es cambiar la configuración en IIS, pero para los servidores donde esto no es posible, mi clase funciona bastante bien. - Código en la parte inferior)
Mientras el proceso de trabajo aún está activo, no se debe despriorizar. Ciertamente no tan rápido como estás describiendo. Es posible que pueda confiar en elementos almacenados en la memoria caché durante un período de tiempo muy breve, y se están cayendo cuando no se los solicitó durante más de unos segundos. Sin saber más sobre los detalles de su aplicación, es imposible decirlo.
Como siempre, perfilar su aplicación es la única forma de proporcionar información concreta. Usar un producto como ANTS lo ayudará a determinar en qué parte del código su aplicación está gastando más tiempo, para que pueda aislar dónde se produce el "bloqueo".
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
}
}
}
uso (tal vez en App_Start):
KeepAlive.Start("http://www.yoursite.com/");
+1, pero pertenece a serverfault. –
¿Está compilando su sitio? Si no, te estás perdiendo algunas mejoras de rendimiento muy grandes. – codethrift
@theminesgreg: los sitios se compilan, la depuración no está establecida, las optimizaciones están activadas para (cualquiera) dlls. @John: No estoy seguro de que pertenezca a serverfault, ya que esto realmente me molesta como programador, pero corrígeme si estoy equivocado – Abel