'Oude' stijl global.asax file in .NET 2.0

Door Luuk1983 op woensdag 1 april 2009 11:58 - Reacties (2)
Categorie: Programmeren, Views: 3.236

De global.asax file in .NET is klasse die je kan gebruiken voor globale functies en variabelen en het behandelen van applicatie gedrag, zoals het starten en stoppen van de applicatie, het starten van een sessie en alle fouten die nog niet afgevangen zijn eventueel alsnog af te vangen. Deze file bestond in .NET 1.1 en Visual Studio 2003 uit een global.asax en een global.asax.cs file, waarbij de global.asax file eigenlijk nutteloos was in zekere zin.

In .NET 2.0 heeft Microsoft waarschijnlijk ook bedacht dat het overbodig was om een global.asax en een global.asax.cs te hebben en in hun oneindige wijsheid hebben ze besloten om de global.asax.cs te laten vervallen en alleen de global.asax over te houden. Deze global.asax ziet er als volgt uit:

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e) 
    {
        // Code that runs on application startup

    }
    
    void Application_End(object sender, EventArgs e) 
    {
        //  Code that runs on application shutdown

    }
        
    void Application_Error(object sender, EventArgs e) 
    { 
        // Code that runs when an unhandled error occurs

    }

    void Session_Start(object sender, EventArgs e) 
    {
        // Code that runs when a new session is started

    }

    void Session_End(object sender, EventArgs e) 
    {
        // Code that runs when a session ends. 
        // Note: The Session_End event is raised only when the sessionstate mode
        // is set to InProc in the Web.config file. If session mode is set to StateServer 
        // or SQLServer, the event is not raised.

    }
       
</script>

Zoals je ziet heeft Microsoft ervoor gekozen om een script tag met de code in de global.asax te plaatsen. Op zich werkt dit natuurlijk wel, maar het gaat tegen het hele principe in dat je je code juist in de .cs file wil hebben. Daarnaast heeft het plaatsen van deze code binnen een script tag beperkingen. Voor een paar simpele kleine dingen werkt deze opzet zonder problemen, maar bij uitgebreide functies is het niet handig. Zo kan je lang niet bij alle objecten binnen het project.

De oplossing is simpel: we 'herstellen' de functionaliteit. De code verplaatsen we naar een 'echte' klasse in een cs file.
  • Maak een nieuwe klasse aan binnen het project. De naam maakt op zich niet zoveel uit, maar het makkelijkste is om deze gewoon iets in de trant van 'Global' te noemen. Denk eraan dat in een Webproject de klasse in de App_Code folder moet staan.
  • Kopieer van de global.asax pagina alle code TUSSEN de <script> tags naar de nieuwe klasse.
  • Gooi de global.asax file nu helemaal leeg.
  • Voeg nu deze code toe aan de lege global.asax file:
    HTML:
    1
    
    <%@ Application Language="C#" Inherits="NaamVanDeNieuweKlasse" %>
  • Klaar! Je kan nu je nieuwe klasse gebruiken om code te schrijven. Je hoeft in principe niet meer in de global.asax file te zijn.
Zo zien de files er bijvoorbeeld uit na het wijzigen:

global.asax
HTML:
1
<%@ Application Language="C#" Inherits="Global" %>


Global.cs
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class Global : System.Web.HttpApplication
{
    public Global()
    {
        //
        // TODO: Add constructor logic here
        //
    }

    void Application_Start(object sender, EventArgs e)
    {
        
    }

    void Application_End(object sender, EventArgs e)
    {
        //  Code that runs on application shutdown

    }

    void Application_Error(object sender, EventArgs e)
    {
        Exception ex = Context.Server.GetLastError();

        //Handle all custom exceptions
        if (ex.InnerException != null)
        {

        }
    }

    void Session_Start(object sender, EventArgs e)
    {
        FormsAuthentication.SignOut();
    }

    void Session_End(object sender, EventArgs e)
    {

    }
}


In Visual Studio 2008 is dit gelukkig allemaal weer terug gedraaid en is de global.asax weer hetzelfde als in Visual Studio 2003.

Volgende: Waarde van een ingevuld wachtwoordveld achterhalen. 04-'09 Waarde van een ingevuld wachtwoordveld achterhalen.
Volgende: Voorkom Skype number highlighting 04-'09 Voorkom Skype number highlighting

Reacties


Door Tweakers user urk_forever, woensdag 1 april 2009 16:28

Welke versie van Visual Studie heb je het hier over?

In mijn volledig geupdate Visual Studio 2005 (versie 8.0.50727.867) op Vista zie ik dit gedrag niet. Dan krijg ik gewoon de Global.asax en Global.asax.cs als ik een Global Application Class toevoeg aan een nieuw web project.

Door Tweakers user Luuk1983, woensdag 1 april 2009 17:11

@urk_forever:
In eerste instantie had je een nieuwe vorm van projecttype in Visual Studio 2005, waarbij het project geen project file meer had. Later is de 'oude' manier van projecten weer terug gekomen. Je hebt nu Websites en WebApplicaties in VS2005. In het eerste geval wordt alles wat in de projectmap zit als relevante files beschouwd. Je hoeft dit project ook niet te compilen, maar gewoon alles, inclusief de cs files, te uploaden. De WebApplication projecten moet je WEL compilen. Volgens mij heeft het gedrag van de global.asax alleen betrekking op WebSites.

Om te kunnen reageren moet je ingelogd zijn. Via deze link kun je inloggen als je al geregistreerd bent. Indien je nog geen account hebt kun je er hier één aanmaken.