c# - sesion - ¿Cómo puedo obtener el valor de una variable de sesión dentro de un método estático?
variables de session en c# net (4)
Estoy usando métodos de página ASP.NET con jQuery ... ¿Cómo obtengo el valor de una variable de sesión dentro de un método estático en C #?
protected void Page_Load(object sender, EventArgs e)
{
Session["UserName"] = "Pandiya";
}
[WebMethod]
public static string GetName()
{
string s = Session["UserName"].ToString();
return s;
}
Cuando compilo esto obtengo el error:
Se requiere una referencia de objeto para el campo, método o propiedad no estático ''System.Web.UI.Page.Session.get''`
Prueba esto:
HttpContext.Current.Session["UserName"].ToString();
Puede acceder a la Session
actual a través de HttpContext.Current
, una propiedad estática a través de la cual puede recuperar la instancia de HttpContext
que se aplica a la solicitud web actual. Este es un patrón común en el Código de aplicación estático y en los métodos de página estáticos.
string s = (string)HttpContext.Current.Session["UserName"];
La misma técnica se utiliza para acceder a la Session
desde los métodos web ASMX decorados con [WebMethod(EnableSession = true)]
porque, aunque dichos métodos no son estáticos, no heredan de la Page
y, por lo tanto, no tienen acceso directo a una propiedad Session
.
El código estático puede acceder al caché de la aplicación de la misma manera:
string var1 = (string)HttpContext.Current.Cache["Var1"];
Si el código estático está dentro de otro proyecto, debemos hacer referencia a System.Web.dll
. Sin embargo, en este caso, generalmente es mejor evitar dicha dependencia porque si se llama al código desde fuera de un contexto ASP.NET HttpContext.Current
será null
, por razones obvias. En cambio, podemos requerir un HttpSessionState
como argumento (aún necesitaremos la referencia a System.Web
por supuesto):
public static class SomeLibraryClass
{
public static string SomeLibraryFunction(HttpSessionState session)
{
...
}
}
Llamada:
[WebMethod]
public static string GetName()
{
return SomeLibraryClass.SomeLibraryFunction(HttpContext.Current.Session);
}
Si no ha cambiado el hilo, puede usar HttpContext.Current.Session
, como lo indica jwwishart.
HttpContext.Current
devuelve el contexto asociado con el hilo. Obviamente, esto significa que no puede usarlo si ha iniciado un nuevo hilo, por ejemplo. Es posible que también deba considerar la agilidad de subprocesos: las solicitudes de ASP.NET no siempre se ejecutan en el mismo subproceso para la totalidad de la solicitud. Creo que el contexto se propaga adecuadamente, pero es algo a tener en cuenta.
HttpContext.Current.Session["..."]
HttpContext.Current
te proporciona el contexto actual ... bueno, Http; desde el cual puede acceder: Sesión, Solicitud, Respuesta, etc.