2012-04-08 3 views
1

Ich habe eine ASP.Net 4.0-Website auf einem Shared-Hosting-System. Anwendungen werden nach 20 Minuten Inaktivität recycelt.Welche Systemkonfiguration oder Fehlfunktion in einer gemeinsam genutzten Hosting-Umgebung kann schreibgeschützte statische Variablen ungültig machen?

In meiner Anwendung werden einige statische Variablen in application_start initialisiert.

Wenn die nächste Anfrage eingeht, sollte die Anwendung neu gestartet, application_start ausgeführt und die statischen Variablen zurückgesetzt werden.

Nach dem Zeitraum der Inaktivität, wenn ich auf Seiten zugreifen, die von den statischen Variablen abhängen, sind sie null und das erzeugt Fehler.

Da diese Variablen in application_start initialisiert werden, scheint es seltsam, dass sie nach dem Zeitraum der Inaktivität null sind, da der Neustart der Anwendung sie neu initialisiert.

Tatsächlich, wenn ich die NULL-Referenzfehler sehe, löst das Recyceln des App-Pools (und das Ausführen von application_start) das Problem, bis die Anwendung das nächste Mal aus dem Speicher gelöscht wird.

Ich frage mich, wenn eine andere Art von Systemspeicherproblem auftritt, wenn die Anwendung aus dem Speicher entfernt wird, denn wenn die Anwendung einfach recycelt wurde, würde die Reinitialisierung der statischen Variable in Application_start bedeuten, es gäbe keinen Grund wenn die Statik null ist.

Da statische Variablen keine Speicherbereinigung sind, sollten sie nach der Initialisierung niemals null sein.

Die Fehler treten auf keinem Entwicklungscomputer auf, nur auf dem Shared Hosting-System. Was könnten andere Ursachen für statische Variablen sein, die in application_start initialisiert wurden, um null zu werden?

Es gibt keinen Code, der die Variablen zurücksetzt. Sie sind private Felder, die nur den Zugriff über eine get-Methode enthalten.

Code:

private static List<State> stateList; 

public static void LoadStaticCache() 
{ 
    var service = DependencyResolver.Current.GetService<ILocationService>(); 
    stateList = service.GetAllStates().ToList(); 
} 

public static List<State> GetStates() 
{ 
    return stateList; 
} 

Wenn die Inaktivitätsperiode erfüllt ist, das nächste Mal der stateList zugegriffen wird, es ist null.

Es wird jedoch immer in application_start initialisiert. Wie kann es jemals null sein, es sei denn, es ist ein Systemproblem?

Die Wiederverwendung des Anwendungspools behebt das Problem zu 100%.

+0

Welche Version von IIS auf Ihrem Shared-Hosting-System ausgeführt wird? Ab Version 7.0 (im integrierten Modus) verhält sich Application_Start etwas anders. – Dubs

+0

Diese verwandte Frage kann helfen: http: // stackoverflow.com/Fragen/5261680/Lebensdauer-of-net-public-static-Variablen und auch diese http://forums.asp.net/t/1429625.aspx/1 – Dubs

+0

Eine weitere für Sie: http://stackoverflow.com/questions/5661202/static-field-in-asp-net-mvc – Dubs

Antwort

1

Es klingt, als ob Ihr Problem mit Sitzungstimeout verbunden ist.

Im Gegensatz zu früheren Versionen von IIS hat Application_Start keinen Zugriff auf den aktuellen HTTP-Kontext, da auf Ihrem gehosteten Server IIS 7.0 oder höher mit integriertem Modus ausgeführt wird, da dieser noch nicht existiert. IIS 7.0 im klassischen Modus wird keine Probleme haben.

In jedem Fall wäre eine Lösung Ihre Initialisierungen Session_Start in Global.asax zu bewegen:

//protected void Application_Start() 
//{ 
// StaticCache.LoadStaticCache(); 
//} 

protected void Session_Start(object sender, EventArgs e) 
{ 
    StaticCache.LoadStaticCache(); 
} 
Verwandte Themen