Das Standardzeitlimit für IIS beträgt 20 Minuten. Das bedeutet, wenn Ihre ASP.NET-Anwendung 20 Minuten lang keine neuen Anforderungen erhält, wird der Worker-Prozess beendet. Es kann eine beträchtliche Menge an Zeit in Anspruch nehmen, den Prozess aus dem Nichts zum Aufwärmen - Ladeeinheiten in dem Speicher, Precompilieren usw.
(bearbeiten: Ich habe eine einfache Hilfsklasse, die das Standard-Timeout Problem behebt - im Grunde des Web-Anwendung "pokes" sich selbst so oft, um den Prozess am Leben zu halten. Der ideale Ansatz ist es, die Einstellung in IIS zu ändern, aber für Server, wo dies nicht möglich ist, funktioniert meine Klasse ziemlich gut. Code an der Unterseite)
Während der Arbeitsprozess noch am Leben ist, sollte es nicht degriorisiert werden. Sicherlich nicht so schnell wie du es beschreibst. Es ist möglich, dass Sie sich auf Objekte verlassen können, die für einen sehr kurzen Zeitraum zwischengespeichert werden, und dass sie ausfallen, wenn sie nicht länger als ein paar Sekunden angefordert wurden. Ohne mehr über die Einzelheiten Ihrer Bewerbung zu wissen, ist das unmöglich zu sagen.
Wie üblich ist das Profilieren Ihrer Anwendung die einzige Möglichkeit, konkrete Informationen zu erhalten. Wenn Sie ein Produkt wie ANTS verwenden, können Sie feststellen, wo im Code Ihre Anwendung die meiste Zeit verbringt, damit Sie isolieren können, wo das "Hängen" auftritt.
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
}
}
}
Usage (vielleicht in App_Start):
KeepAlive.Start("http://www.yoursite.com/");
+1, aber gehört zu serverfault. –
Kompilieren Sie Ihre Site? Wenn nicht, verpasst du einige sehr große Leistungsverbesserungen. – codethrift
@theminesgreg: Websites sind kompiliert, Debug ist nicht festgelegt, Optimierungen sind für die (alle) DLLs aktiviert. @John: Nicht sicher, dass es auf Serverfault gehört, da dies mich als Programmierer wirklich beunruhigt, aber korrigieren Sie mich, wenn ich falsch liege – Abel