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:
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:
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.
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.
[ Voor 4% gewijzigd door Verwijderd op 22-10-2005 21:46 ]