本地环境下,ASP.NET Session在PostBack后变为null。

3
以下是我的代码,它在页面加载时运行:
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();
    }
}

有时候当我尝试将数据保存到数据库时出现错误,我会尝试通过点击保存按钮重新保存数据,但是会遇到以下错误:

对象引用未设置为对象的实例。

这个错误会在下面的代码行上出现:
else if (Session["AccessLevel"].ToString().Equals("2"))

为什么会出现这个错误?

这是我的登录用户控件中的代码,其中ChR是用于记住用户的复选框:

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");
            }

在我的主页面中,我在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

你看过这篇文章吗?http://arstechnica.com/civis/viewtopic.php?f=20&t=220827 - Adriano Repetti
乔,你以前没有遇到过这样的问题吗?那可能会给你一些想法,可能是什么出了问题?你看到我这里的代码有什么问题吗?另外,这是我设置会话值的代码: - gwt
也许你正在失去会话,因为应用程序域正在回收。http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx - Tim Schmelter
@khashayar - 请给回答点赞并接受它,如果它正确地解决了你的问题。这也有助于其他遇到类似问题的社区用户。 - Pankaj
@访客,不幸的是,我最近才在这个网站上注册,并且我没有足够的声望来投票!如果您可以给我的问题投一票,我想我将获得一些声望来投票支持答案 ;) - gwt
4个回答

6

我想我找到了为什么我的会话变成null的原因! 当我想要将有关书籍的信息保存在数据库中并在应用程序文件夹中保存书籍的图像文件时,我没有权限保存该文件,我的应用程序会抛出一个错误并且所有会话都会变成null !!!


这意味着,如果有任何应用程序错误,会话将变为空! - HydPhani

1

请将您的代码替换为以下内容。

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

}

我希望你能理解==Equals()之间的区别。

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

你可以省略String.IsNullOrEmpty调用,因为当测试“val ==“2””时,空字符串和null值仍将返回false。 - The Moof
我的意思是,我不知道为什么会话值在回发时变为空值!这仍然是个问题! - gwt
@khashayar,请分享将值分配给“Session”变量的代码。 - Pankaj
谁也不知道为什么会话变成了null?! - gwt
1
@khashayar - 如果你想要调试,请确保在 global.asax 文件中有 Session_startend 事件。这将帮助你追踪实际的根本原因。只需在这两个事件中设置断点,以仔细检查此问题的根本原因。 - Pankaj
显示剩余8条评论

0
为什么会出现这个错误?
因为 Session["AccessLevel"] 是空值,而你试图在一个空对象上调用一个方法。

0

对于其他用户,请检查您的会话超时。可能是问题所在。您可以使用以下方法更改默认超时时间

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接