C# ASP.NET会话在本地服务器上回发后变为空
以下是我在页面加载时运行的代码:C# ASP.NET会话在本地服务器上回发后变为空,c#,asp.net,C#,Asp.net,以下是我在页面加载时运行的代码: protected void Page_Load(object sender, EventArgs e) { DisableChaching(); if (Request.Cookies["UserName"] == null) { if (Session["UserName"] == null) { Response.Redirect("~/Default.aspx");
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
为什么我会犯这个错误
因为
Session[“AccessLevel”]
为空,并且您正试图对空对象调用一个方法。如下所示替换您的代码
string val = Convert.ToString(Session["AccessLevel"]);
if (val == "2")
{
}
我希望您理解=
和等于()之间的区别
我想我找到了我的会话变为空的原因!当我想在数据库中保存一本书的信息,并在应用程序文件夹中保存该书的图像文件时,我没有保存该文件的权限,我的应用程序会抛出一个错误,并且我的所有会话都会变为空 对于其他用户,请检查会话超时。也许这就是问题所在。您可以使用更改默认超时
<system.web>
<authentication mode="Forms">
<forms timeout="50"/>
</authentication>
<sessionState timeout="60" />
</system.web>
你读过这篇文章吗?乔,你以前没有遇到过这样的问题吗?!这可能会让你意识到什么是错的?你看到我的代码有什么问题吗?这是我设置会话值的代码:也许你正在丢失会话,因为应用程序域正在回收@khashayar-请投票并接受正确解决您问题的答案。这也有助于其他面临类似问题的社区用户。@Guest不幸的是,我最近在这个网站注册,我没有足够的声誉来投票!如果你投票支持我的问题,我想我会赢得一些声誉来投票支持答案;)如果会话再次为空,我将在您的第一行代码中得到相同的错误!您可以省略String.IsNullOrEmpty调用,因为在测试'val==“2”Convert时,空字符串和null值仍将返回false。ToString
将不会抛出错误,如果会话变量中的值为null,则相同的null值将返回到字符串变量。你测试过上面提到的代码吗?根据你的代码,我没有得到我之前提到的错误消息,但仍然有一个问题:我也没有会话值@khashayar-如果要调试,请确保在global.asax
文件中有Session\u start和end
事件。这将帮助您追踪实际的根本原因。只需在这两个事件中设置断点
,即可详细检查此问题的根本原因。这意味着,如果存在任何应用程序错误,会话将变为空!
<system.web>
<authentication mode="Forms">
<forms timeout="50"/>
</authentication>
<sessionState timeout="60" />
</system.web>