sobre el objeto session

06/10/2005 - 19:35 por Enrique | Informe spam
hola a todos,

tengo un problema de eliminacion de datos cuando salgo de la sesion
(session_onend del global.asa). el caso es que dentro de mi
"DELETE...WHERE", la condicion no me funciona use lo que use (sea
session("sessionID") o session.sessionID). el campo sessionID de mi tabla
temporal es de tipo texto, asi que para provocar el error, no le pongo las
comillas simples, pero nada que hacer, no se provoca ningun tipo de error ni
se eliminan los datos.

eso me hace suponer que el programa no pasa por ahi al salir (lo que me
sorprendre porque creo que en teoria es lo que deberia hacer). pero me hace
dudar sobre mi entendimientode la session.

asi que les dire lo que me parece a ver si estoy en lo cierto:
* el objeto session se crea cada vez que un usuario se conecta a nuestro
sitio web
* cada objeto session tiene un sessionID que identifica de forma unica a
cada usuario (como un clave primaria digamos)

* la session muere o cuando pasan el tiempo maximo estipulado (20mn por
defecto pero modificable) o cuando se cierra de forma explicita la pagina
web (puede ser porque lo quiere asi el usuario o por cualquier problema de
tipo hardware, software, corte de luz)

¿estoy en lo cierto? ¿algo se me escapa? ¿porque no me funciona la
eliminacion de los datos en la tabla temporal? ¿se ejecuta el codigo o no?
¿si no se ejecuta porque? ¿como podria hacer para que funcionara? dicho de
otra forma, ¿donde deberia colocar mi codigo para que funcione esta
eliminacion?, ¿seria posible hacer esta eliminacion en el "session_onstart"
en vez del "session_onend"? ¿daria problemas cuando hay mas de un usuario
conectado a la vez?. en este caso, no se trataria de eliminar los datos de
nuestro sessionID sino todos los datos de la tabla temporal, lo que quiza
podria afectar a otros sessionID que estan activos (usuarios conectados).

otra cosa: ¿existe una diferencia entre cerrar una pagina y hacer un logout?
¿como se hace un logout?

Preguntas similare

Leer las respuestas

#1 Manuel Vera
06/10/2005 - 20:02 | Informe spam
Te explico...

1.- La Session (el objeto) solo funciona si, y solo si, el cliente web o
navegador tiene las cookies habilitadas.

2.- Cada cliente web que entra a tu sitio abre una nueva Session, siempre
que tenga las cookies activadas. Si no las tiene activas, la session se
genera con cada visita a cada página.

3.- El OnEnd() del global.asa únicamente se ejecuta cuando:
manualmente)
salir a traves de:
Session.Abandon()
y luego el Application_OnEnd

4.- En cuanto a forzar el error de SQL no sucede pues:
es igual que
esto se debe a que el motor SQL es "inteligente" y hace la conversión
necesaria en el tipo de datos.

5.- Lo que no estoy seguro es que el Session.SessionID se conserve cuando
entras al Session_OnEnd. De no conservarse el valor inicial entonces allí
está la causa del porque no puedes borrar los datos, pues el ID ya no es el
mismo. Prueba con el siguiente código que te ayudará a depurar:
sub Session_OnEnd()
... tu codigo ...
'aqui lo que haces es grabar un archivo de texto con la sentencia de
DELETE para que verifiques si el Session.SessionID está trayendo el valor
real a borrar.
call grabarMsg(SQL_DELETE)
...tu codigo...
end sub
function grabarMsg(texto)
dim fs, ruta, f
Set fs = CreateObject("Scripting.FileSystemObject")
ruta = "c:\msg" & cdbl(now) & ".txt"
Set f = fs.CreateTextFile(ruta, true, false)
f.write texto
f.Close
set f = nothing
set fs = nothing
end function

Salu2
MV


"Enrique" wrote in message
news:
hola a todos,

tengo un problema de eliminacion de datos cuando salgo de la sesion
(session_onend del global.asa). el caso es que dentro de mi
"DELETE...WHERE", la condicion no me funciona use lo que use (sea
session("sessionID") o session.sessionID). el campo sessionID de mi tabla
temporal es de tipo texto, asi que para provocar el error, no le pongo las
comillas simples, pero nada que hacer, no se provoca ningun tipo de error


ni
se eliminan los datos.

eso me hace suponer que el programa no pasa por ahi al salir (lo que me
sorprendre porque creo que en teoria es lo que deberia hacer). pero me


hace
dudar sobre mi entendimientode la session.

asi que les dire lo que me parece a ver si estoy en lo cierto:
* el objeto session se crea cada vez que un usuario se conecta a nuestro
sitio web
* cada objeto session tiene un sessionID que identifica de forma unica a
cada usuario (como un clave primaria digamos)

* la session muere o cuando pasan el tiempo maximo estipulado (20mn por
defecto pero modificable) o cuando se cierra de forma explicita la pagina
web (puede ser porque lo quiere asi el usuario o por cualquier problema de
tipo hardware, software, corte de luz)

¿estoy en lo cierto? ¿algo se me escapa? ¿porque no me funciona la
eliminacion de los datos en la tabla temporal? ¿se ejecuta el codigo o no?
¿si no se ejecuta porque? ¿como podria hacer para que funcionara? dicho de
otra forma, ¿donde deberia colocar mi codigo para que funcione esta
eliminacion?, ¿seria posible hacer esta eliminacion en el


"session_onstart"
en vez del "session_onend"? ¿daria problemas cuando hay mas de un usuario
conectado a la vez?. en este caso, no se trataria de eliminar los datos de
nuestro sessionID sino todos los datos de la tabla temporal, lo que quiza
podria afectar a otros sessionID que estan activos (usuarios conectados).

otra cosa: ¿existe una diferencia entre cerrar una pagina y hacer un


logout?
¿como se hace un logout?




Respuesta Responder a este mensaje
#2 Enrique
06/10/2005 - 21:14 | Informe spam
muchas gracias por tu exposicion. todo esta muy claro. he creado el archivo
que me has dicho pero sencillamente no se crea por lo que es facil intuir
que el evento session_onend no occurre y no se ejecuta nada.

o sea, como bien has dicho: el evento session_onend occure cuando se hace un
session.abandon (logout), reset del server o caduca la sesion. ¿que pasa
entonces cuando se cierra el navegador? ¿pasa algo? ¿no pasa nada? ¿no
ocurre ningun tipo de evento? ¿no existe ninguna forma de forzar la salida
de sesion para provocar un session_onend mediante un session.abandon?

la cosa esta clara: simplemente quiero eliminar datos al salir de la
aplicacion, algo muy facil en aplicaciones windows porque orientadas a
eventos pero aqui parece dificil sino imposible, ¿es asi? ¿realmente se
puede pensar que no existe solucion?

gracias de nuevo por tu ayuda
Respuesta Responder a este mensaje
#3 Manuel Vera
06/10/2005 - 22:13 | Informe spam
Bueno, para una respuesta basada en la práctica, lee el post que envió
nuestro amigo Matías.
En cuanto a lo teórico, para que tu como programador forces la salida del
usuario y la ejecución del OnEnd() tendrías que colocar en tu web un link o
enlace que apunte a un ASP donde ejecutes:
Session.Abandon()

Ahora, si el cliente o usuario no hace click allí y simplemente cierra el
navegador o escribe en la casilla de la direccion otra dirección web,
entonces, <EN TEORIA>, cuando se cumple el tiempo de caducidad de la
session, es cuando se ejecutaría el OnEnd de ese usuario. A estas alturas de
yo estar respondiendote este nuevo post debería estar creado el archivo
según la rutina que te envié (si aplicamos la teoría). Revisa a ver, pues ya
deben haber pasado los 20 minutos o más desde que cerraste el navegador para
probar. De no ser así, entonces es que nuevamente MS nos entregó un software
con fallas (alguien ha oido algo que llaman service packs? todos los dias
sale uno nuevo, ¿cierto?, ¿eso es calidad de soporte o ineficiencia de
desarrollo? =) un poco de ironía para cerrar.)

Salu2
MV




"Enrique" wrote in message
news:
muchas gracias por tu exposicion. todo esta muy claro. he creado el


archivo
que me has dicho pero sencillamente no se crea por lo que es facil intuir
que el evento session_onend no occurre y no se ejecuta nada.

o sea, como bien has dicho: el evento session_onend occure cuando se hace


un
session.abandon (logout), reset del server o caduca la sesion. ¿que pasa
entonces cuando se cierra el navegador? ¿pasa algo? ¿no pasa nada? ¿no
ocurre ningun tipo de evento? ¿no existe ninguna forma de forzar la salida
de sesion para provocar un session_onend mediante un session.abandon?

la cosa esta clara: simplemente quiero eliminar datos al salir de la
aplicacion, algo muy facil en aplicaciones windows porque orientadas a
eventos pero aqui parece dificil sino imposible, ¿es asi? ¿realmente se
puede pensar que no existe solucion?

gracias de nuevo por tu ayuda



Respuesta Responder a este mensaje
#4 Enrique
06/10/2005 - 23:38 | Informe spam
hola a todos,

lo primero agradecerles su ayuda. he repasado alguna documentacion y el tema
esta claro: cuando se cierra el navegador asi sin mas, IIS trata la sesion
por inactividad, es decir de la misma forma que el timeout. le da igual que
un usuario no haga nada durante 20 mn a que haya cerrado la aplicacion y no
pase nada en el mismo tiempo.

es decir: el session_onend occurira 20 mn despues o el tiempo que hayamos
especificado. he hecho pruebas con timeout = 1 e imposible ejecutar mi SQL,
quiza por el sessionID que ya se puede haber perdido. he hecho otra prueba
sin WHERE para no depender de ningun valor y ver si se ejecuta la SQL:
tampoco.

solucion:
el "map.path" no esta permitido en la cadena de conexion. hacer un DSN y
todo funciona perfectamente con el sessionID incluido, eso si, hay que
esperar el timeout :-)
Respuesta Responder a este mensaje
#5 Matías Iacono
07/10/2005 - 00:26 | Informe spam
Solo una acotación.

Dentro de la misma documentación de MS, se dice que el Session_OnEnd en ASP
tiende a no funcionar correctamente, y en la nueva version, o sea, ASP.net,
este problema se solucionó.

Esto lo recuerdo desde que lo leí (Hace ya varios años), debido a que estube
con los mismos problemas que plantean.

Despues de mucho buscar y tratar de que funcione, preferí cambiar la forma
de enfocar la aplicación.

Saludos.

Matías Iacono
Microsoft MVP ASP/ASP.net - DCE3
"Manuel Vera" escribió en el mensaje
news:upN1m$
Te explico...

1.- La Session (el objeto) solo funciona si, y solo si, el cliente web o
navegador tiene las cookies habilitadas.

2.- Cada cliente web que entra a tu sitio abre una nueva Session, siempre
que tenga las cookies activadas. Si no las tiene activas, la session se
genera con cada visita a cada página.

3.- El OnEnd() del global.asa únicamente se ejecuta cuando:
estipulado
manualmente)
de
salir a traves de:
Session.Abandon()
Session_OnEnd
y luego el Application_OnEnd

4.- En cuanto a forzar el error de SQL no sucede pues:
es igual que
esto se debe a que el motor SQL es "inteligente" y hace la conversión
necesaria en el tipo de datos.

5.- Lo que no estoy seguro es que el Session.SessionID se conserve cuando
entras al Session_OnEnd. De no conservarse el valor inicial entonces allí
está la causa del porque no puedes borrar los datos, pues el ID ya no es
el
mismo. Prueba con el siguiente código que te ayudará a depurar:
sub Session_OnEnd()
... tu codigo ...
'aqui lo que haces es grabar un archivo de texto con la sentencia de
DELETE para que verifiques si el Session.SessionID está trayendo el valor
real a borrar.
call grabarMsg(SQL_DELETE)
...tu codigo...
end sub
function grabarMsg(texto)
dim fs, ruta, f
Set fs = CreateObject("Scripting.FileSystemObject")
ruta = "c:\msg" & cdbl(now) & ".txt"
Set f = fs.CreateTextFile(ruta, true, false)
f.write texto
f.Close
set f = nothing
set fs = nothing
end function

Salu2
MV


"Enrique" wrote in message
news:
hola a todos,

tengo un problema de eliminacion de datos cuando salgo de la sesion
(session_onend del global.asa). el caso es que dentro de mi
"DELETE...WHERE", la condicion no me funciona use lo que use (sea
session("sessionID") o session.sessionID). el campo sessionID de mi tabla
temporal es de tipo texto, asi que para provocar el error, no le pongo
las
comillas simples, pero nada que hacer, no se provoca ningun tipo de error


ni
se eliminan los datos.

eso me hace suponer que el programa no pasa por ahi al salir (lo que me
sorprendre porque creo que en teoria es lo que deberia hacer). pero me


hace
dudar sobre mi entendimientode la session.

asi que les dire lo que me parece a ver si estoy en lo cierto:
* el objeto session se crea cada vez que un usuario se conecta a nuestro
sitio web
* cada objeto session tiene un sessionID que identifica de forma unica a
cada usuario (como un clave primaria digamos)

* la session muere o cuando pasan el tiempo maximo estipulado (20mn por
defecto pero modificable) o cuando se cierra de forma explicita la pagina
web (puede ser porque lo quiere asi el usuario o por cualquier problema
de
tipo hardware, software, corte de luz)

¿estoy en lo cierto? ¿algo se me escapa? ¿porque no me funciona la
eliminacion de los datos en la tabla temporal? ¿se ejecuta el codigo o
no?
¿si no se ejecuta porque? ¿como podria hacer para que funcionara? dicho
de
otra forma, ¿donde deberia colocar mi codigo para que funcione esta
eliminacion?, ¿seria posible hacer esta eliminacion en el


"session_onstart"
en vez del "session_onend"? ¿daria problemas cuando hay mas de un usuario
conectado a la vez?. en este caso, no se trataria de eliminar los datos
de
nuestro sessionID sino todos los datos de la tabla temporal, lo que quiza
podria afectar a otros sessionID que estan activos (usuarios conectados).

otra cosa: ¿existe una diferencia entre cerrar una pagina y hacer un


logout?
¿como se hace un logout?








Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida