2009-08-06 7 views
5

Zum Thema dynamische Speicherung temporärer Bilder und Behandlung ihrer Bereinigung im Dateisystem eines Webservers: (mit C# in .NET 3.5).Verwendung und Geltungsbereich von global.asax (für Dateibereinigung nach Beendigung der Anwendung)

Es wurde vorgeschlagen, dass ich eine global.asax Datei verwenden, um damit umzugehen.

Ich kann einfach nicht herausfinden, wie das Ding funktioniert.

Ich habe zwei separate Anwendungen ...

Ich habe herausgefunden, dass die global.asax im Stammverzeichnis der Website sein soll.

Fragen:

1) Wie bekomme ich die global.asax für nur diese beiden spezifischen Anwendungen zu feuern.

2) Beide Anwendungen müssen eine Liste von Zeichenfolgen (die Dateispeicherorte) erstellen und sie dann beim Beenden der Anwendung löschen. Instantiiere ich dieses Array in der App oder in der global.asax?

Mein Code sieht wie folgt aus:

List<string> fileLocations = new List<string>(); 
//I don't know where to put this. 

//The next line of code will be in both applications (this could 
//be called many times in one application session. The names of 
//the files are generated from the clock (milliseconds and 
//seconds combined, I might change this to use the actual 
//random class combined with sessionID) 
fileLocations.Add(file); 

void Application_End(object sender, EventArgs e) 
{ 
    // Code that runs on application shutdown 
    foreach(string file in fileLocations) 
    { 
     if(File.Exists(file)) 
      File.Delete(file); 
    }  
} 

Ich bin verwirrt darüber, wie die global.asax tatsächlich funktioniert. Wird es wie eine Schnittstelle verwendet?

Antwort

3

Ein guter Ort, um zu sehen, wie Global.asax zu verwenden ist, lesen Sie die ASP.NET Quickstart on it's usage. Sie haben eine pro Webanwendung/Site. Es ist so ähnlich wie Ereignisse auf globaler Ebene.

Beachten Sie, dass das Ereignis Application_End auf den meisten Servern nicht häufig ausgelöst wird. Es wird nur ausgelöst, wenn der IIS-App-Pool entladen/recycled, web.config geändert, Assemblys in/Bin oder in einer anderen Situation, in der der Webserver gestoppt wird, geändert wird. Auf einer beliebten Website kann es Wochen, Monate dauern, bevor Ihre Veranstaltung ausgelöst wird.

+0

So gibt es keinen einfachen Weg, nur zu erkennen, wenn jemand mit einer Anwendung fertig ist und ein Bereinigungsskript ausführen? Ich denke, das sollte viel einfacher sein als es ist:/ – Dave

+0

Nun, wenn der Benutzer angemeldet ist, dann können Sie das Session_End-Ereignis auch in Global.asax verwenden. Standardmäßig ist es 20 Minuten, aber Sie können Ihr eigenes Limit setzen. Siehe http://stackoverflow.com/questions/621744/how-to-handle-session-end-in-global-asax und http://justgeeks.blogspot.com/2008/07/aspnet-session-timeouts.html –

+0

Ah, ok. Also, wenn ich eine Liste in der global.asax Datei deklariere, instanziiert sie eine neue Liste für jede Benutzersitzung, oder erkläre ich die Liste in meinem Programm und irgendwie hat der global.asax Zugriff darauf. Wie ich schon sagte, ich entschuldige mich für die grundlegenden Fragen ... Ich bin normalerweise ziemlich gut darin, dieses Zeug selbst zu finden, aber aus irgendeinem Grund ist das global.asax nicht sehr intuitiv für mich. – Dave

2

MSDN Link und Wikipedia Link sind Orte zu starten.

Es wird nicht wie eine Schnittstelle, eher wie ein Filter, der eine Reihe von verschiedenen Haken für Dinge wie das Starten des Application-Objekts oder eine Sitzung oder eine Anfrage hat. Der Wikipedia-Link hat eine Liste von Aufrufen, die Global.asax ausführen kann, obwohl ich vorschlagen würde, für einen Moment zurückzutreten, um zu verstehen, wie eine Webanwendung im Vergleich zu einer Desktopanwendung endet. IIS kann einen AppPool als eine Möglichkeit wiederverwenden, die Anwendung zu beenden, obwohl es andere gibt. Daher ist die Einstellung einer Bereinigung auf Anwendungsende möglicherweise nicht die beste Idee, wenn dieses Ereignis nie ausgelöst wird.

+0

Ich lese beide, aber diese führen mich zu mehr Verwirrung. Es scheint mir, dass diese suggerieren, dass die global.asax ausschließlich Speichervariablen verwendet wird, auf die von jeder Sitzung oder jeder Anwendung zugegriffen werden kann. Was nützlich ist, aber nicht für das, was ich gerade mache. Ich hatte den Eindruck, dass global.asax Threads für den Start einer einzelnen Anwendung und ein einzelnes Anwendungsende erstellen kann. – Dave

+0

Ich denke, Sie haben möglicherweise ein Missverständnis über die Verwendung der Session- und Anwendungsobjekte in ASP.Net. Für jeden verbundenen Benutzer existiert eine Sitzung. Wenn Benutzer A eine Variable im Session-Objekt gespeichert hat, ist diese für niemanden außer für Benutzer A zugänglich. Im Gegensatz dazu ist das Application-Objekt wirklich global, da es nur eines davon gibt Der Server wird ausgeführt, daher muss bei der Verwendung darauf geachtet werden, als ob Sie die Informationen von Benutzer A im Anwendungsobjekt speichern möchten. Sie müssen den Schlüssel auf eine bestimmte Weise markieren, damit er für diesen Benutzer eindeutig ist. Sie könnten einen Thread irgendwo in ASP erstellen.Net –