La sesión ASP.NET se vuelve nula después de la devolución de datos en local

Aquí está mi código que se ejecuta en la carga de la página:

protected void Page_Load(object sender, EventArgs e)
{
    DisableChaching();
    if (Request.Cookies["UserName"] == null)
    {
        if (Session["UserName"] == null)
        {
            Response.Redirect("~/Default.aspx");
        }
        else if (Session["AccessLevel"].ToString().Equals("2"))
        {
            Response.Redirect("~/Default.aspx");
        }
    }
    else if (Session["AccessLevel"].ToString().Equals("2"))
    {
        Response.Redirect("~/Default.aspx");
    }
    if (!IsPostBack)
    {
        LoadControls();
        BindGrid();
    }
}

A veces, cuando trato de guardar algunos datos en la base de datos y obtengo un error, trato de volver a guardar los datos haciendo clic en mi botón Guardar, y aparece este error:

Referencia a objeto no establecida como instancia de un objeto

en la siguiente línea si el código:

else if (Session["AccessLevel"].ToString().Equals("2"))

¿Por qué recibo este error?

aquí está mi código en el control de usuario de inicio de sesión donde ChR es la casilla de verificación para recordar al usuario:

if (ChR.Checked == true)
            {
                Response.Cookies["UserName"].Value = txtUserName.Text.Trim();
                Response.Cookies["UserName"].Expires = DateTime.Now.AddMonths(2);
                Response.Cookies["AccessLevel"].Value = member.AccessLevel.ToString();
                Response.Cookies["AccessLevel"].Expires = DateTime.Now.AddMonths(2);
                Response.Cookies["FirstName"].Value = member.FirstName;
                Response.Cookies["FirstName"].Expires = DateTime.Now.AddMonths(2);
                Response.Cookies["LastName"].Value = member.LastName;
                Response.Cookies["LastName"].Expires = DateTime.Now.AddMonths(2);
                Session["UserName"] = txtUserName.Text.Trim();
                Session["AccessLevel"] = member.AccessLevel.ToString();
                Response.Redirect("~/Default.aspx");
            }
            else
            {
                Session["UserName"] = txtUserName.Text.Trim();
                Session["AccessLevel"] = member.AccessLevel.ToString();
                Session["FirstName"] = member.FirstName;
                Session["LastName"] = member.LastName;
                Response.Redirect("~/Default.aspx");
            }

y en mi página maestra asigno valores a las sesiones de esta manera en el evento page_Load:

DisableChaching();
    FillInfo();
    if (Request.Cookies["UserName"] != null)
    {
        Session["UserName"] = Request.Cookies["UserName"].Value;
        Session["AccessLevel"] = Request.Cookies["AccessLevel"].Value;
        Session["FirstName"] = Request.Cookies["FirstName"].Value;
        Session["LastName"] = Request.Cookies["LastName"].Value;
        WellCome();
        if (Session["AccessLevel"].ToString() == "1")
        {
            RenderMenu(AcccessLevel.SiteManager);
        }
        else if (Session["AccessLevel"].ToString() == "2")
        {
            RenderMenu(AcccessLevel.Client);
        }
    }
    else if (Session["UserName"] != null)
    {
        WellCome();
        if (Session["AccessLevel"].ToString() == "1")
        {
            RenderMenu(AcccessLevel.SiteManager);
        }
        else if (Session["AccessLevel"].ToString() == "2")
        {
            RenderMenu(AcccessLevel.Client);
        }

    }
    else
    {
        WellGo();
        RenderMenu(AcccessLevel.LogedOutUser);
    }
enter code here

preguntado el 03 de mayo de 12 a las 16:05

¡¿Joe, no habías tenido ese problema antes?! eso podría traerte una idea de lo que podría estar mal? ¿Ves algo malo con mi código aquí? y también aquí está mi código para establecer valores de sesión: -

Tal vez esté perdiendo la sesión porque el dominio de la aplicación se recicla. blogs.msdn.com/b/tess/archive/2006/08/02/… -

@khashayar: vote a favor y acepte la respuesta que aborda su problema correctamente. Esto también ayuda a otros usuarios de la comunidad que enfrentan problemas similares. -

@Guest desafortunadamente me registré en este sitio web recientemente y no tengo suficiente reputación para votar. Si vota mi pregunta, creo que obtendré cierta reputación para votar la respuesta;) -

4 Respuestas

¡Creo que descubrí por qué mis sesiones se vuelven nulas! cuando quiero guardar información sobre un libro en db y guardar un archivo de imagen del libro en una carpeta de la aplicación, no tengo permiso para guardar el archivo y mi aplicación arroja un error y todas mis sesiones se vuelven nulas.

contestado el 04 de mayo de 12 a las 08:05

Eso significa que si hay algún error en la aplicación, ¡la sesión se vuelve nula! - HydPhani

Reemplace su código como se muestra a continuación.

string val = Convert.ToString(Session["AccessLevel"]);
if (val == "2")
{

}

Espero que entiendas la diferencia entre == y Equals()

public static String AccessLevel {
    get
    {
        return Convert.ToString(HttpContext.Current.Session["AccessLevel"]);
    }
    set
    {
        HttpContext.Current.Session["AccessLevel"] = value;
    }
}

contestado el 03 de mayo de 12 a las 17:05

si la sesión vuelve a ser nula, ¡obtendré el mismo error en la primera línea de código! - gwt

Puede omitir la llamada String.IsNullOrEmpty ya que las cadenas vacías y los valores nulos aún devolverían un falso al probar 'val=="2"' - El Moof

Convert.ToString nunca arrojará un error, si el valor es nulo en el session variable el mismo valor nulo se devolverá a la variable String. ¿Probaste el código mencionado anteriormente? - Pankaj

Por su código, no recibo el mensaje de error que mencioné antes, pero todavía hay un problema: ¡tampoco tengo el valor de la sesión! - gwt

@khashayar: si desea depurar, asegúrese de tener Session_start and end eventos en global.asax Archivo. Esto le ayudará a localizar la causa raíz real. solo configura breakpoints en estos dos eventos para verificar minuciosamente la causa raíz de este problema. - Pankaj

¿Por qué recibo este error?

Porque Session["AccessLevel"] es nulo y está intentando llamar a un método en un objeto nulo.

contestado el 03 de mayo de 12 a las 16:05

Para otros usuarios, verifique el tiempo de espera de su sesión. puede ser que sea el problema. puede cambiar el tiempo de espera predeterminado usando

<system.web>
   <authentication mode="Forms">
      <forms timeout="50"/>
   </authentication>

   <sessionState timeout="60"  />
</system.web>

Respondido 14 ago 15, 15:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.