2011-02-15 24 views
6

Cuando el usuario inicia una sesión, quiero almacenar su ID de usuario en la sesión conalmacenar ID de usuario en la sesión

HttpContext.Current.Session["UserID"] = 2354; (this is just a hard-coded example) 

Entonces, cuando corro un método de página, si lo hago

var test = HttpContext.Current.Session["UserID"]; 

¿La prueba variable mantendrá el valor que guardé cuando él inició sesión?

Si esta es una manera correcta de hacerlo, ¿Cómo accedo a la sesión cuando recibo una llamada de un método de página? Quiero poner la línea test = ... en un método de página para identificar de qué usuario proviene la solicitud.

Gracias.

+1

Eso es lo que las sesiones están ahí para que - el mantenimiento de datos a través de solicitudes de página, así que ... sí. –

+0

El problema es que cuando pongo un punto de interrupción en el método de página, obtengo \t \t Session ["UserID"] \t Se requiere una referencia de objeto para el campo, método o propiedad no estático 'System.Web.UI.Page .Session.get ' – frenchie

Respuesta

3

Como ya se ha contestado, sí - que debería estar bien, aunque si se sienta en una página demasiado tiempo antes de llamar a un servicio utilizando este método [WebMethod] se producirá un error . La mejor práctica en ese caso es verificar la sesión y reconstruir según sea necesario. Lo mismo es cierto para cualquier otra autenticación para garantizar que no se hayan sincronizado o caducado.

[WebMethod(EnableSession = true)] 

    HttpContext context = HttpContext.Current; 
    if (context.Session["UserID"] == null) { 
     Utilites.PopulateSessionVars(context.Request.ClientCertificate, context.Request.ServerVariables["REMOTE_ADDR"]); 
    } 
    String userId = context.Session["UserID"].ToString(); 

(donde Utilities.PopulateSessionVars es un método para reconstruir los datos de la sesión fuera de lo que está utilizando para conectarse ... que en mi caso es un certificado PKI)

0

Sí, pero es aconsejable hacer una prueba inmediatamente después de la asignación de la variable test para asegurarse de que el ID de usuario se configuró correctamente antes de intentar usarlo.

EDITAR

Usted podría intentar:

var test; 

if (HttpContext.Current.Session["UserID"] != null) 
{ 
    test = HttpContext.Current.Session["UserID"]; 
} 
+0

el problema es que cuando pongo un punto de interrupción en el método de la página, consigo Sesión [ 'ID de usuario'] \t se requiere una referencia de objeto para el campo no estático, método o propiedad' System.Web. UI.Page.Session.get' – frenchie

0

Sí, eso debería funcionar. Sin embargo, la sesión y autenticación formas tiempos de espera se encuentran en diferentes temporizadores y tienen diferentes tiempos de espera por defecto por lo que no puede garantizar que el valor en la sesión estará disponible para el período de tiempo durante el cual se autentica al usuario si está usando la autenticación de formularios.

0

Esto debe hacerlo

//Note: this code hasn't been tested. Correct me if I'm wrong 

//To Set: 
if (Session["UserId"] == null) 
    Session["UserId"] = "12345"; 

//To Get it: 
if (Session["UserId"] != null) 
    MyObject.Id = Session["UsedId"].ToString(); 
+0

Por el momento, sólo quiero tener un ID de usuario codificada en la sesión. Entonces, en el archivo global.asax, tengo Session ["UsedID"] = 6; Sin embargo, eso no funciona. – frenchie

0

Global.asax corre en el nivel de aplicación. Desea las sesiones de usuario, que es un contexto HTTP diferente. Inicialice la sesión en la página de inicio/inicio de sesión predeterminado en su lugar.

+0

Estoy de acuerdo contigo. – Student

Cuestiones relacionadas