gpt4 book ai didi

c# - 为什么session对象会抛出空引用异常?

转载 作者:太空狗 更新时间:2023-10-29 20:51:46 24 4
gpt4 key购买 nike

在我的一些 aspx 页面上,我正在检查这样的 session

if (bool.Parse(Session["YourAssessment"].ToString()) == false
&& bool.Parse(Session["MyAssessment"].ToString()) == true)
{
Response.Redirect("~/myAssessment.aspx");
}

如果我经常玩页面,它工作正常,但如果我至少 5 分钟不对页面做任何事情,运行页面就会抛出错误

Object reference not set to an instance of an object.

下面是堆栈

[NullReferenceException: Object reference not set to an instance of an object.]
yourAssessment.Page_Load(Object sender, EventArgs e) in d:\Projects\NexLev\yourAssessment.aspx.cs:27
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
System.Web.UI.Control.OnLoad(EventArgs e) +91
System.Web.UI.Control.LoadRecursive() +74
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2207

有人能给我解释一下这种奇怪的行为吗?

正如我们所知,默认情况下 session 持续时间为 20 分钟。

已编辑

看到我有一个默认的 aspx 页面,它有一个按钮,它在某些基础上修复了重定向的位置在默认页面上,它会像这样检查

protected void Page_Load(object sender, EventArgs e)
{
if (!HttpContext.Current.Request.IsAuthenticated)
{
Response.Redirect("~/login.aspx");
}
else
{
Session["YourAssessment"] = false;
Session["MyAssessment"] = false;
}
}

点击按钮有

protected void imgClientFreeEval_Click(object sender,
System.Web.UI.ImageClickEventArgs e)
{
if (HttpContext.Current.Request.IsAuthenticated)
{
string sqlQuery = "SELECT count(*) FROM SurveyClient WHERE UserID='"
+ cWebUtil.GetCurrentUserID().ToString() + "'";
SqlParameter[] arrParams = new SqlParameter[0];
int countSurvey = int.Parse(
Data.GetSQLScalerVarQueryResults(sqlQuery).ToString());
if (countSurvey > 0)
{
Session["YourAssessment"] = true;
Session["MyAssessment"] = false;
}
Response.Redirect((countSurvey > 0)
? "~/yourAssessment.aspx"
: "~/myAssessment.aspx");
}
else
{
Response.Redirect("~/login.aspx");
}

在 myAssessment 页面上,它是这样检查的

protected void Page_Load(object sender, EventArgs e)
{
if (!HttpContext.Current.Request.IsAuthenticated)
{
Response.Redirect("~/login.aspx");
}
else
{
if (Session["YourAssessment"] != null
&& Session["MyAssessment"] != null
&& bool.Parse(Session["YourAssessment"].ToString())
&& !bool.Parse(Session["myAssessment"].ToString()))
{
Response.Redirect("~/yourAssessment.aspx");
}
}
}

在 yourAssessmtn 上它会像这样检查

protected void Page_Load(object sender, EventArgs e)
{
if (!HttpContext.Current.Request.IsAuthenticated)
{
Response.Redirect("~/login.aspx");
}
else
{
if (Session["YourAssessment"] != null
&& Session["MyAssessment"] != null
&& !bool.Parse(Session["YourAssessment"].ToString())
&& bool.Parse(Session["MyAssessment"].ToString()))
{
Response.Redirect("~/myAssessment.aspx");
}

PopulateAllSurveyByUser();
if (ViewState["surveyClientID"] != null)
{
grdSurveyDetail.Visible = true;
PopulateSurveyDetails(
int.Parse(ViewState["surveyClientID"].ToString()));
}
else
{
grdSurveyDetail.Visible = false;
}
}
}

请解释一下有什么问题吗?

最佳答案

您首先需要检查该 session 变量是否存在

if(Session["YourAssessment"] != null)
// Do something with it
else
// trying to call Session["YourAssessment"].ToString() here will FAIL.

发生这种情况是因为您的 session 具有生命周期,这意味着 - 它会过期(定义它的 cookie 会过期) - 因此您的对象会消失。您可以在 web.config 中增加 sessionState timeout 以使您的 session 持续更长时间。

例如,在 web.config 中

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

将使您的 session 持续 40 分钟,只要客户端不清除它,并且 Web 服务器已启动并正在运行。

关于c# - 为什么session对象会抛出空引用异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10536136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com