|
Af Henrik Busschou
August 2005
Send e-mail
Introduktion
Som tiden går har jeg stødt på mange brugere, som ikke ved, hvad global.asa er for noget. Derfor vil jeg med denne artikel gerne
beskrive, hvad global.asa er for en fil, og hvad den kan bruges
til.
Finder du undervejs en fejl/mangel eller måske en udvidelse, jeg
mangler at beskrive, så send endelig en mail.
Inden du går i gang, bør du være opmærksom på følgende:
1) Jeg har ladet mig fortælle. at en
del gratis udbydere ikke understøtter brugen af global.asa. Dette har jeg dog ikke testet. Vær blot opmærksom på det, hvis
du står og vil have den billigste løsning.
2) Vær grundig når du retter i global.asa. Du kan risikere, at
din applikation kommer til at hænge, så kun din udbyder kan sætte
den i gang igen!
3) Når du ændrer din global.asa fil, vil serveren vente med at rekompilere den,
indtil alle kørende processer er endte. Den vil
samtidig nægte nye forespørgsler med meddelelsen "500-12 Application Restarting". Således vil hele din hjemmeside altså
blive sat "offline", indtil den sidste bruger har forladt siden.
Hvad er global.asa?
Global.asa er en fil, der benyttes til at
deklarere globale
variable på applikations og sessions niveau.
Filen er event baseret og kan kun i begrænset omfang
benyttes som en normal asp fil. Fx. kan den på nær ét tilfælde
ikke benyttes til at skrive ud på en skærm mm. og er af samme
årsag nogen gange lidt sværd at debugge.
Filen skal hedde "global.asa" og hører til i roden af
dit
domæne. Man kan kun have én global.asa fil pr. domæne, med
mindre man har subdomæner, hvorved hvert subdomæne kan have sin
egen global.asa fil.
Fast indhold
Global.asa har en rimelig streng opbygning og består af fire
metoder, som hver især reagerer på givne hændelser.
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
//Kode der udføres når applikationen starter
End Sub
Sub
Application_OnEnd
//Kode der udføres når applikationen lukker
End
Sub
Sub Session_OnStart
//Kode der køres når en session
starter
End Sub
Sub Session_OnEnd
//Kode der køres når en session
slutter
End Sub
</SCRIPT>
Jeg vælger her at kode i VBScript, men filen kan kodes frit i
det scriptsprog, som står en nærmest fx JScript.
Filen reagerer altså på fire hændelser, men undlades en af
metoderne i filen, svarer dette blot til at lade den stå tom som
herover.
Brug af scripting uden for <script> tag´ene resulterer i en fejl.
Brug af html kode, eller funktioner, som ikke benyttes i nogen af
de fire hændelser bliver ignoreret af serveren.
Det eneste kode, man kan have uden for de fire standard metoder,
er andre metoder eller funktioner, altså ingen "løs" kode.
Bemærk at metoderne er event baserede.
De kører altså kun, når en
given event indtræffer, og de kan ikke kaldes fra andre asp
sider.
Tilsvarende kan evt. andre metoder i global.asa kun kaldes fra
disse fire metoder og ikke fra andre asp sider.
Ud over metoderne herover har man mulighed for at
deklarere
objekter og typebiblioteker.
Herunder vil jeg beskrive
metoderne nærmere ...
Application_OnStart
Hvornår?
Metoden køres, når ens applikation starter. Dette sker én gang,
nemlig første gang en bruger går ind på et site. Metoden
kaldes som det første og køres således før Session_OnStart
Når man har redigeret i sin global.asa fil, og serveren har rekompileret den, så genstartes ens applikation hvorved metoden
igen køres én gang første gang en bruger går ind på ens site.
Hvad kan jeg?
Du har adgang til Application og Server objektet.
Hvad kan jeg ikke?
Du har ikke adgang til Session, Request og Response objektet.
Kald til disse vil give fejl.
Bemærk:
Eftersom metoden kun køres een gang når den første session
starter applikationen, behøves man ikke at låse og frigive applicationen ved Application.Lock og Application.Unlock.
Application_OnEnd
Hvornår?
Metoden kører én gang, når ens applikation slutter. Hvis du fx
retter i din global.asa, så vil serveren først nægte adgang til
nyankomne processer. Den vil herefter vente på at samtlige
processer afsluttes. Når alle processer er afsluttet, kalder den
denne metode, genkompilerer global.asa og genstarter
applikationen.
Metoden kører som det sidste, dvs. den køres først efter
Session_OnEnd er kaldt for sidste gang.
Hvad kan jeg?
Du har adgang til Application og Server objektet på nær Server.Mappath.
Hvad kan jeg ikke?
Du har ikke adgang til Session, Request og Response objektet
samt Server.Mappath. Kald til disse vil give fejl.
Bemærk:
Metoden køres som den "anonyme bruger" på serveren. I tilfælde
af der ikke er en sådan, eller den ikke kan logge på, da køres
denne metode ikke.
Session_OnStart
Hvornår?
Metoden køres én gang, hver en bruger første gang går ind på et site. Hver gang en bruger åbner en browser og går ind på
en side, starter der en session, som gør, at serveren kan holde
styr på, hvem den kommunikerer med. Inden denne session startes,
kaldes denne metode én gang.
Metoden køres således, inden den først kaldte side køres.
Hvad kan jeg?
Du har adgang til alle objekter dvs, Application, Server,
Session, Response, Request og ObjectContext.
Bemærk:
Da denne metode køres, inden nogen sider vises, vil det være god
kodestil at definere sine sessions variable her.
Hvis du i metoden angiver en redirect, da vil evt. kode efter
denne redirect ikke blive udført.
Session_OnEnd
Hvornår?
Metoden køres én gang, inden en brugers session dør. Metoden
køres enten eksplicit, hvis man kalder Session.Abandon eller når
en session får timeout. Ved timeout kaldes først denne metode,
dernæst frigiver serveren sine brugte ressourcer.
Hvad kan jeg?
Du har adgang til Application, Server og Session objektet på nær
Server.Mappath.
Hvad kan jeg ikke?
Du har ikke adgang til Response og Request objektet samt
Server.Mappath.
Bemærk:
Metoden køres som den "anonyme bruger" på serveren. I tilfælde
af der ikke er en sådan, eller den ikke kan logge på, da køres
denne metode ikke.
Hvad så nu?
Det var faktisk det. Herover står, hvad du kan med global.asa, og
hvad du ikke kan. For at finde en fornuftig nytte kræver det
selvfølgelig, at man ved hvad sessionen og applicationen kan
bruges til. Måske er det også en god ide at kende lidt til Object og
TypeLibrary deklerationer. Men i bund og
grund er det det.
Men inden i slutter helt, skal
vi da lige se et par eksempler på forskellige
anvendelsesmuligheder.
Redirect så en bruger altid starter på en given side:
' Bemærk at dette kun virker hos brugere, som har cookies slået til
' da der ellers ikke dannes en unik sessions id
<SCRIPT Language=VBScript RUNAT=Server>
Sub Session_OnStart
'
Definer en startside
startPage = "/MyApp/StartHere.asp"
' Find
den nuværende side
currentPage =
Request.ServerVariables("SCRIPT_NAME")
' Lav en sammenligning og redirect hvis de er forskellige
If
strcomp(currentPage,startPage,1) then
Response.Redirect(startPage)
End If End Sub
</SCRIPT>
Tæl online brugere:
' Bemærk at applikationen låses hver gang der tilgåes
applikations variable
' Bemærk også at at brugerantallet ikke straks tælles ned,
' når en bruger lukker
sin browser
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub
Application_OnStart
Application("intBrugereOnline") = 0
End Sub
Sub Session_OnStart
Application.Lock
Application("intBrugereOnline") = Application("intBrugereOnline")
+ 1
Application.Unlock
End Sub
Sub Session_OnEnd
Application.Lock
Application("intBrugereOnline") =
Application("intBrugereOnline") - 1
Application.Unlock
End Sub
</SCRIPT>
Gem connectionstrings som globale variable
' På denne måde behøves man
ikke gå og huske conn strengen
' Mange gemmer conn strengen i en include, som så inkluderes på
alle sider
' Med denne metode gemmes conn strengen en gang for alle
' Samtidig ses at server.mappath kan benyttes i metoden Application_OnStart
<SCRIPT
LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
Application("db1") = "DBQ=d:\home\domæne.dk\database\database.mdb;UID=;PWD=;"&_
"Driver={Microsoft Access Driver (*.mdb)};"
Application("db2") =
"DBQ=" & Server.MapPath("database.mdb") &";UID=;PWD=;"&_
"Driver={Microsoft Access Driver (*.mdb)};"
End Sub
</SCRIPT>
Opdater database når brugere kommer online, og når de går offline
Mange spørger, hvordan de sætter deres brugere offline, når
brugerne ikke logger af, men når de lukker deres browser.
Hvis en logud funktion kalder Session.Abandon, da vil
nedenstående tage højde for begge dele.
Hvis brugeren lukker browseren, vil Session_OnEnd blive kaldt, når
sessionen timer ud efter 10-20 minutter afhængig af, hvad man har sat
den til.
Første gang der kommer en bruger ind på siden sættes en
connectionstreng, herved slipper man for bøvl med at
server.mappath ikke kan benyttes i Session_OnEnd
Læg mærke til at der i Session_OnStart sættes sessions variable
ud fra det, som er indtastet i en login form.
Dette kræver, at ens login form er *.html og ikke *.asp. Hvis
filen hed asp, så ville metoden jo kaldes, inden man indtaster i
formen.
Bemærk også hvordan man her kan tjekke på login og redirecte
hvis det fejler med mere.
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
Application("db") = "Data Source="&Server.Mappath("database.mdb")&_
";Provider=Microsoft.Jet.OLEDB.4.0;"
End Sub
Sub Session_OnStart
Session("bruger") = Replace(Request.Form("bruger"),"'","''")
Session("kode") = Replace(Request.Form("kode"),"'","''")
Dim
Conn, rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open Application("db")
Set rs = Conn.Execute("Select * From
tabel Where bruger = '"&_
Session("bruger")&"' And kode = '"&Session("kode")&"'")
If not rs.eof Then
Session("id") = rs("Id")
Conn.Execute("Update
tabel Set online = True Where Id = "&Session("id"))
Else
Session.Abandon
Response.Redirect "login.html"
Conn.Close
Set
Conn = Nothing
End If
Conn.Close
Set Conn = Nothing
End Sub
Sub
Session_OnEnd
Dim Conn
Set Conn =
Server.CreateObject("ADODB.Connection")
Conn.Open
Application("db")
Conn.Execute("Update tabel Set online = False
Where Id = "&Session("id"))
Conn.Close
Set Conn = Nothing
End
Sub
</SCRIPT>
stem her!
|