Toon posts:

[ASP.NET] Events vragen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Elke ASP.NET heeft een global.asax file. hierin kun je voor verschillende events codes voor schrijven. Bijvoorbeeld voor de event Application_OnStart en Session_OnStart events.

Is het misschien mogelijk om op HTTP handler / HTTP Module niveau ook zulke events te schrijven af te laten gaan als bijvoorbeeld een request binnenkomt of als de request afgehandeld is?

Voor de HTTP Module heb je ik oa de volgende events gevonden, namelijk:
- BeginRequest;
- AcqureRequestState;
- ReleaseRequestState;
- PostRequestHandlerExecute;

In de global.asax file kan je oa voor de volgende events code voor schrijven:
- application_OnStart;
- session_start;
- Session_OnEnd;
- application_OnPostRequestHandlerExecute;

Ik heb voor de HTTP module het volgende stukje score code geschreven:

code:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
......
......
.....
    public void Init(HttpApplication App)
        {
            
            App.BeginRequest += new EventHandler(OnBeginRequest);
            App.AcquireRequestState += new EventHandler(SessionStart);
            App.ReleaseRequestState += new EventHandler(SessionEnd);
            App.PostRequestHandlerExecute += new EventHandle(OnPostRequestHandlerExecute);
        }

    private void OnBeginRequest(Object sender, EventArgs e)
        {
            
            Hashtable ht = (Hashtable)HttpApp.Context.Application    ["SESSION_LIST"];
            if(ht == null)
            {
                ht = new Hashtable();
                lock(HttpApp.Context.Application)
                {
                    HttpApp.Context.Application["SESSION_LIST"] = ht;
                    HttpApp.Context.Application["APP_START_TIME"] = DateTime.Now;
                    HttpApp.Context.Application["TOTAL_SESSIONS"] = 0;
                }
            }
        }

private void SessionStart(Object sender, EventArgs e)
        {
            Visitor ui = new Visitor();
            HttpApp.Context.Session["USER_INFO_MAP"] = ui;

        //Haal HashTable uit de Applicatie object --> Application["SESSION_LISTt"]
            if(ht.ContainsKey(HttpApp.Context.Session.SessionID) == false)
            {
                //voeg sessieID in HashTable
            }

            lock(HttpApp.Context.Application)
            {
                //verhoog aantal sessie met 1       
                                                }


        }


        private void SessionEnd(Object sender, EventArgs e)
        {
            HttpApp.Context.Session.Clear();
            //verwijdere overige
        }

private void OnPostRequestHandlerExecute(Object sender, EventArgs e)
{
....
....
...
}


De bovenstaande 4 methode werken allemaal als ik deze plaats in een global.asax file. Nou heb ik deze methode dus in een http module geplaats en getest. Alleen heb ik twee problemen, waar ik echt de balluh van snapt en 1 vraag over http Handler.

1 als ik in de Init methode het volgende code toevoegt:

code:
1
App.ReleaseRequestState += new EventHandler(SessionEnd);


dan krijg ik een "Object reference not set to an instance of an object." error. Het enigste wat ik in de SessionEnd methode doe is de Session.Clear() methode aanroepen en de de SessionID uit de HashTable verwijderen. De hashTable haal ik uit de Application object.

2 Voor elke request wordt er een nieuwe sessie gemaakt.Wat ik eigenlijk wil bereiken is dat er voor een gebruiker maar een sessie wordt aangemaakt. want elke keer als een een request doe wordt er een nieuwe sessie gemaakt.

om dit probleem op te lossen heb ik gedacht om de Session object in de Application object te stoppen. Is dit de enigste manier om dit probleem aan te pakken of zijn er nog andere mogelijkheden?

3 In de HTTP module kan je allerlei events laten registreren. is dit ook mogelijk voor de HTTP handler?

Hopelijk kunnen jullie mij helpen. _/-\o_

[ Voor 4% gewijzigd door Verwijderd op 22-10-2005 21:46 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:17

gorgi_19

Kruimeltjes zijn weer op :9

Wat is het doel van die applicatie, want ik heb zo een vermoeden dat je het moeilijker maakt dan het is. Sowieso: Waarom een Application object en geen Cache; deze is niet gekoppeld aan HttpContext namelijk. Application afaik wel.

@2: Blokkeer je toevallig cookies?

@3: een HttpHandler is vergelijkbaar met een pagina / bestand en geldt indien hij direct wordt aangeroepen; een HttpModule geldt voor alle request welke door de ASP.NEt dll afgehandeld worden in die application

[ Voor 56% gewijzigd door gorgi_19 op 22-10-2005 21:48 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op zaterdag 22 oktober 2005 @ 21:46:
Wat is het doel van die applicatie, want ik heb zo een vermoeden dat je het moeilijker maakt dan het is. Sowieso: Waarom een Application object en geen Cache; deze is niet gekoppeld aan HttpContext namelijk. Application afaik wel.
nou het is meer een soort uitprobeersel. In dit geval wil ik voor elke request een aantal gegevens eruit filteren (bijvoorbeeld het vastleggen van welke pages een bezoeker heeft bezocht etc).

Voor de Cache object moet ik nog naar kijken maar ik heb begrepen dat deze beter is dan de Application object.

wat ik eigenlijk wil bereiken is de methodes die ik in de global.asax heb gezet deze te verplaatsen naar een HTTP module of HTTP Handler.en deze te laten werken op een willekeurige applicatie die een referentie heeft naar de http module of http handler.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:17

gorgi_19

Kruimeltjes zijn weer op :9

Hiervoor moet je een HttpModule gebruiken; vergeet de HttpHandler :) Tenzij je iets vergelijkbaars wil doen als netstat en een apart plaatje op een pagina wil opnemen, dan is het plaatje de HttpHandler. :)

Zie trouwens ook http://www.15seconds.com/issue/021119.htm :)

[ Voor 14% gewijzigd door gorgi_19 op 22-10-2005 21:52 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op zaterdag 22 oktober 2005 @ 21:51:
Hiervoor moet je een HttpModule gebruiken; vergeet de HttpHandler :) Tenzij je iets vergelijkbaars wil doen als netstat en een apart plaatje op een pagina wil opnemen, dan is het plaatje de HttpHandler. :)

Zie trouwens ook http://www.15seconds.com/issue/021119.htm :)
Bedankt voor de link. nou ik ben voornamelijk ASP.NET aan het leren en te kijken wat de mogelijkheden zijn vandaar.

weet jij misschien ook hoe ik bijvoorbeeld application_onStart event kan koppelen aan een HTTP handler? bij een HTTP module is dit makkelijk te doen.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:17

gorgi_19

Kruimeltjes zijn weer op :9

Niet. Een pagina heeft geen idee wanneer een applicatie wordt gestart en heeft er ook niets mee te maken. Je zal dan in de HttpModule in de Cache / Application / bestand / database/ where ever iets moeten aanmaken en deze in de HttpHandler moeten uitlezen.

[ Voor 42% gewijzigd door gorgi_19 op 22-10-2005 22:26 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1