Avatar billede busschou Praktikant
21. april 2005 - 16:33 Der er 12 kommentarer og
1 løsning

global.asa

Hey

Er der ikke nogen som kan forklare mig helt præcist hvornår hvad i en global.asa fil køres?
Altså Application_onstart, Application_onend, Session_onstart, Session_onend
Så vidt jeg forstår så kørers sessionerne hver gang en bruger går ind eller ud af en side?
Mens Applicationerne kun køres når global.asa lægges ud ?
Hvad kunne man forestille sig at bruge Application_onend til?

Og sidst hvordan tilgår man det man laver i global.asa?
Jeg har kigget lidt her
http://www.w3schools.com/asp/asp_globalasa.asp
Der er et eksempel på at hive noget ud af en database een gang og gemme det i et recordset.
Så langt så godt. Men når jeg på siden så forsøger "lege" med den variabel sat i application("min_var") ...så siger den bare "Object Required"
Så hvordan gør man lige ? ;o)
Avatar billede moejensen Nybegynder
21. april 2005 - 16:38 #1
Jeg er heller ikke helt sikker, men jeg mener at det du sætter i application virker så længe den pågældende instands af siden kører på serveren. Det vil sige du kan evt tælle hvor længe det er sinden servicen der kører websitet blev genstartet. Du kan også bruge det til at gemme variabler på applikationsniveau - altså uafhængig af den enkelte bruger.
Avatar billede moejensen Nybegynder
21. april 2005 - 16:40 #2
Avatar billede moejensen Nybegynder
21. april 2005 - 16:42 #3
her kan du se hvordan du kalder variabler i global.asa

http://activedeveloper.dk/artikler/default.asp?articleid=132
Avatar billede busschou Praktikant
21. april 2005 - 16:46 #4
Jeg har kigget på de sider ;o)
Og jeg har snildt kunne lave en tæller - hvor applicationen gemmer et tal som i eksemplet.
Mit problem er denne her:
-----------
<SCRIPT LANGUAGE=VBScript RUNAT=Server>

Sub Application_OnStart
End Sub

Sub Application_OnEnd
End Sub

Sub Session_OnStart
  Set ConnMenu = Server.CreateObject("ADODB.Connection")
  DNS = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=minsti"
  ConnMenu.Open DNS
  Set rs = ConnMenu.Execute("Select * From mapper")
  Application("mapper") = rs.GetRows
  rs.Close
  Set rs = ConnMenu.Execute("Select * From sider")
  Application("sider") = rs.GetRows
  rs.Close
  ConnMenu.Close
  Set ConnMenu = Nothing
End Sub

Sub Session_OnEnd
End Sub

</SCRIPT>
-------
Når jeg på mine sider vil have fat i det recordsæt som er gemt som Application("sider") og vil løbe det igennem. Så siger den til mig "object required"
Og det forstår jeg ikke.
Avatar billede busschou Praktikant
21. april 2005 - 16:48 #5
Det jeg er interesseret i er det samme som nævnt i linket oppe i spørgsmålet.
Jeg vil slippe for at kontakte databasen et utal af gange
Men i eksemplet hiver de det ind i Application_onstart
Det dur jo ikke når den kun bliver kørt een gang i "næsten hele sin levetid" eftersom databasen jo godt kan ændre sig med tiden.
Derfor vil jeg have hentet det hele ind een gang når brugeren går ind på siden. Og så derefter blot hente det derfra ....
Avatar billede luzk Nybegynder
21. april 2005 - 17:45 #6
Applikation_OnStart bliver ganske rigtigt kørt hver gang applikationen starter, men det kan ske flere gange end når global.asa bliver lagt ud. Det sker fx også efter genstart af IIS eller genstart af serveren.

Applikation_OnEnd bliver kørt når IIS genstartes, eller når server genstartes - dog ikke altid, for hvis servicen ryger sig en tur kan man ikke sikre sig den er blevet kørt.
Desuden køres denne når sidste session timer ud på en given applikation. Dvs en applikation kun lever så længe der er brugere tilknyttet. Jeg har fået fortalt dette kan sættes op, men har ikke set det udført.

Session_OnStart bliver kørt hver gang en unik bruger åbner sitet. En bruger der bruger to browsere vil tælle for en unik bruger pr browser!
Hvis du lukker din browser ned og starter den op igen tæller det som endnu en unik bruger.

Session_OnEnd køres når en session timer ud - altså ikke når sitet forlades, men typisk efter de 20 min der er standard for en session.

I dit eksempel, skal der ikke sættes noget "Set" ind der?

For at teste din kode, kan du hive alt fra din Session_OnStart sub ind på en normal ASP side og så køre det. Derved kan du se om det er dit script i global.asa der fejler.

Håber det hjælper dig lidt på vej...

...Luzk
Avatar billede luzk Nybegynder
21. april 2005 - 17:46 #7
Forresten mener jeg også det kræver at en bruger går på sitet før Application_OnStart bliver kaldt - er dog ikke helt sikker på den...

...Luzk
Avatar billede busschou Praktikant
21. april 2005 - 17:49 #8
luzk >> sætte noget "Set" ind? ... har da sat dem alle?.. Det virker fint nok på min side normalt. Ville bare have det i global.asa for at undgå at kalde databasen et utal af gange
Avatar billede luzk Nybegynder
21. april 2005 - 18:06 #9
Hmmm - ok... hvis det er kode der virker på en normal side, burde det også virke i global.asa
Jeg har lige kigget min egen global.asa, og sorry for forslaget med Set - mig der var for hurtig :-)

Jeg benytter selv følgende måde:

Application.Lock
Application("NumGuests") = Application("NumGuests") + 1
Application.UnLock

Application.Lock "låser" applkation, så kun én session kan arbejde med variablen af gangen. Alle sessioner sættes dog i kø, så der er ikke nogen der glemmes...

Application.UnLock markerer at applikationen igen er fri, og næste i køen bliver behandlet

/Luzk
Avatar billede luzk Nybegynder
21. april 2005 - 18:09 #10
Det ser u til det egentlig er en sessions variabel du er ude efter, så du kan forsøge at lave det om til session variable istedet.

Jeg definerer altid selv applikations variable i Application_OnStart, og kalder dem kun i Session_OnStart hvis der sker opdateringer i selve sessionen

/Luzk
Avatar billede busschou Praktikant
22. april 2005 - 13:04 #11
nu ser min global.asa sådan ud... forsøg på at gemme et recordset i en sessions varibel hvis jeg forstod dig ret luzk?
----
<SCRIPT LANGUAGE=VBScript RUNAT=Server>

Sub Application_OnStart
End Sub

Sub Application_OnEnd
End Sub

Sub Session_OnStart
  Set ConnMenu = Server.CreateObject("ADODB.Connection")
  DNS = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=min_sti"
  ConnMenu.Open DNS
  Set rs = ConnMenu.Execute("Select * From mapper")
  Session("mapper") = rs.GetRows
  rs.Close
  Set rs = ConnMenu.Execute("Select * From sider")
  Session("sider") = rs.GetRows
  rs.Close
  ConnMenu.Close
  Set ConnMenu = Nothing
End Sub

Sub Session_OnEnd
End Sub

</SCRIPT>
-----
på min side gør jeg så følgende:
-----
Set rs = Session("mapper")
do while not rs.eof
response.write rs("navn")
rs.movenext
loop
-----
Men den giver fejl:
-----
Microsoft VBScript runtime  error '800a01a8'

Object required

/test/default.asp, line 11
-----
Linje 11 er
Set rs = Session("mapper")
Hvad går galt?
Avatar billede busschou Praktikant
23. april 2005 - 10:48 #12
Jeg er en klaphat tror jeg
Det virker nu fordi jeg havde taget fejl af hvordan getRows lige virkede
Så hvis nogen vil have points for svar omkring hvor og hvornår de forskellige metoder i global.asa virker så svar løs :o) .. ellers lukker jeg igen om nogen dage ;o)
Avatar billede moejensen Nybegynder
24. april 2005 - 13:15 #13
så skidt da
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester