Angel, y a todos:
Muchas gracias por sus respuestas
Me siervieron muchisimo
Logre armar algo como mencionaban, al llamar a un thread le cargo el
USSes y el USApp en los items del thread
Luego en el metodo GetSession, controlo si existe el httpcurrent, si no
es asi, devuelvo el del thread
Hasta el momento esta funcionado bien, ahora voy a chequear si todo el
resto sigue funcionando igual
Gracias Totales !!!
Diego
_____
De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Angel
"Java" Lopez
Enviado el: Lunes, 20 de Agosto de 2007 15:32
Para: [email protected]
Asunto: [puntonet] HttplContext (Session y Aplication)
Hola gente!
Diego, si lanzas un nuevo thread, estando en una aplicacion web, hmmm....
por lo que vi, tenes la informacion en un solo objeto
HttpContext.Current.Session("USSes"), .... bien, al lanzar un nuevo thread,
seguramente invocando algun metodo de un objeto intermedio, le sembraria a
ese objeto el HttpContext.Current.Session("USSes") de tu thread originario,
para que lo implante en el Call Context de Remoting. Tus helpers, deberian
preguntar por el HttpContext.Current y si es Nothing, preguntar por el Call
Context de Remoting
No se si me explico... A ver, sea la clase
Class ObjetoLanzadorDeThread
Private mAGuardar as Object
Public Sub New(aguardar as Object)
mAGuardar = aguardar
End Sub
Public Sub Run() ' lanzado desde un nuevo thread
CallContext.Save("USSes", mAGuardar) ' no recuerdo la sintaxis de
CallContext
' hacer lo que tengas que hacer en el thread.... lanzar otro objeto,
metodo, lo que sea
end sub
End Class
Se lanzaria como
Dim launcher as new ObjetoLanzadorDeThread(GetSes)
launcher.Run
Se podria pasar a launcher dos objetos, uno de GetSes, y otro de GetApp.
Otra alternativa es no pasarle nada y que se informe por si mismo, en el
constructor, algo como:
Class ObjetoLanzadorDeThread
Private mAGuardar as Object
Public Sub New(aguardar as Object)
mAGuardar = GetSes ' tu helper de lo que querias guardar en Session
End Sub
Public Sub Run() ' lanzado desde un nuevo thread
CallContext.Save("USSes", mAGuardar) ' no recuerdo la sintaxis de
CallContext
' hacer lo que tengas que hacer en el thread.... lanzar otro objeto,
metodo, lo que sea
end sub
End Class
Algo mas refinado seria que en vez de Helpers, tuvieras propiedades shared
en una clase
Public Class GranDiego
Public Shared Property ApplicationData as Object
Get
' si esta HttpContext.Current, la sacamos de
HtppContext.Current.Application("USApp"), sino de CallContext de remoting
end Get
Set(value as Obejct)
' si esta HttpContext.Current, lo guardamos ahi, sino lo
guardamos en CallContext
End Set
end Property
Public Shared Property SessionData as Object
' lo mismo, pero de HttpContext.Current.Session, o de otra variable
de CallContext
End Property
End Class
Tonche, el objeto lanzador haria
Class ObjetoLanzadorDeThread
Private mApplicationData as Object
Private mSessionData as Object
Public Sub New(aguardar as Object)
mApplicationData = GranDiego.ApplicationData
mSessionData = GranDiego.SessionData
End Sub
Public Sub Run
' Notablemente, esto deberia andar en un nuevo thread
GranDiego.ApplicationData = mApplicationData
GranDiego.SessionData = mSessionData
End Sub
Es decir, el objeto lanzador se crea en el thread T1, eso hace que su
constructor tome todo el contexto actual de session y application, sea donde
sea que este localizado (la localizacion la resuelven las propiedades
shared). Luego como el Run se ejecuta en otro thread, reimplantara esos
datos, en lo que le corresponda a ese nuevo thread T2.
Espero que se haya entendido algo...
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
----- Original Message -----
From: Diego <mailto:[EMAIL PROTECTED]> Baselica
To: [email protected]
Sent: Thursday, August 16, 2007 6:12 PM
Subject: [puntonet] HttplContext (Session y Aplication)
damian, esto hice algo similar a lo que vos mencionas
Pero tengo un problema, ya qiue seguramente encare algo mal de entrada
Cuando Incia mi aplicacion tengo un Objeto USApplication que contiene
informacion de la empresa que inicio y otros datos generales, que lo pongo
en HttpContext.Current.Aplication("USApp")
Cuando un usuario inicia sesion tengo otro objeto USSession que tiene el
IDUsuario, fecha inicio, procesos a lso que puede acceder, etc, que lo pongo
en HttpContext.Current.Session("USSes")
Luego tengo un Helper que
GetApp --> que devuelve el valor de HttpContext.Current.Aplication("USApp")
GetSes --> que devuelve el valor de HttpContext.Current.Session("USSes")
En capas de servicios/mapers por ejemplo tengo un proceso que consulta datos
y debe obtener siempre los del usuario que se logueo, entonces armo un
filtro con el usuario de la session
Ej: "IDUser = " & GetSes.IDUser
Hasta ahi venia todo bien
Cuando se invoca desde un WebService, y las llamadas en capas subsiguientes,
Servicios, Entidades, Mapper, tengo acceso al HttpContext.Current
Resulta que ahora tuve que hacer unos procesos en el logion de usuario, Ej,
ejecutar tareas programadas del usuario al inicio de sesion, que generan
algun reporte y lo envian por mail
Pero esto no lo puedo hace rsincronico en el login, porque sino el ingreso
del usuario demora mucho.
Entonces se me ocurrio lanzar la ejecucion de esas tareas en un Thread
distinto
Pero me encontre que el HttpContext.Current no existe mas, Nothing, y por lo
tanto mis metodos GetApp y GetSes dan error y no puedo utiliza los valores
Creo que el tema es que no deberia almacenar mis objetos en el
HttpContext.Current,
Con el obketo USAplication, lo veo factible de ponerlo como una variable
Shared o algo similar, pero con las sesiones, necesito que de alguna forma
poder devolver la sesion de usuario y no lo veo,
Pensaba un diccionario shared, pero con que key lo acceso, ya que tampoco
tengo el HttpContext.Current.SessionID
Alguna idea???
Ing. Diego M. Basélica
e-mail: [EMAIL PROTECTED]
UpSoft Sistemas Informáticos
Rafael Nuñez 3498 (X5009CFO) Córdoba, Argentina
Tel/Fax: 0351-4814812 (rot.)
www.upsoft.com.ar
_____
De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Damián
Herrera
Enviado el: Jueves, 16 de Agosto de 2007 15:33
Para: [email protected]
Asunto: [puntonet] HttplContext (Session y Aplication)
Hola Diego,
Podes crearte una especie de wrapper tuyo que encapsule el uso de
HttpContext y de acuerdo al contexto en el que corres (Web o Win) utilizas
el contexto adecuado.
Yo por ejemplo lo utilizo de esta manera:
Public Shared Sub [Add](ByVal pKey As String, ByVal pValue As Object)
Mutex.WaitOne()
If HttpContext.Current Is Nothing Then
CallContext.FreeNamedDataSlot(pKey)
CallContext.SetData(pKey, pValue)
Else
HttpContext.Current.Items.Remove(pKey)
HttpContext.Current.Items.Add(pKey, pValue)
End If
Mutex.ReleaseMutex()
End Sub
Saludos,
Damián Herrera
_____
From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Diego
Baselica
Sent: Thursday, August 16, 2007 1:44 PM
To: [email protected]
Subject: [puntonet] HttplContext (Session y Aplication)
Hola estoy buscando una solucion para reemplazar el HttpContext.Current, ya
que alli estao almacenando mis objetos de sesion de usuario, pero cuando
utilizo otros hilos de ejecucion, pierdo dicho contexto y mi proceso falla
Buscando encontre una supuesta solucion en el sitio de AJlopez Create
<http://www.ajlopez.net/ArticuloVe.php?Id=634> your own HttpContext class ,
pero el link no funciona, asi que queria saber si alguien por casualidad
tiene elgo de este material o referirme a otro lugar donde buscarlo.
O alguna otra solucion para este tipo de problemas
Muchas gracias
<mailto:[EMAIL PROTECTED]>
Ing. Diego M. Basélica
e-mail: [EMAIL PROTECTED]
UpSoft Sistemas Informáticos
Rafael Nuñez 3498 (X5009CFO) Córdoba, Argentina
Tel/Fax: 0351-4814812 (rot.)
www.upsoft.com.ar
__________ Información de NOD32 2466 (20070816) __________
Este mensaje ha sido analizado con NOD32 Antivirus System
http://www.nod32.com