我正在尝试解决会话ID似乎在回发期间神秘清除的问题。我确信正在设置该值,并且我的代码中没有其他地方可以清除该会话。另外,我在会话页面的viewstate中存储会话ID的值。在回发期间,viewstate为空,这实质上意味着当将值分配给viewstate时,会话变量为null。是否有可能在代码执行期间,会话对象因超时而被清除?
所以,如果我有以下代码,请说。
if (session["id"] == null) :line1
{ :line2
session["id"] = // Generate some unique id :line3
} :line4
viewstate["id"] = session["id"]; :line5
理论上可行的是,即使session [“id”]在line1中不为null,由于超时,它在line5上为null。
答案 0 :(得分:3)
我不得不说不。我刚建立了一个站点并将会话超时设置为1(分钟)
<system.web>
<compilation debug="true" targetFramework="4.0" />
<sessionState timeout="1"></sessionState>
</system.web>
然后在页面加载中添加了一个带有此页面的网页
protected void Page_Load(object sender, EventArgs e)
{
Session["Test"] = "Tester";
//Should be longer than the 1 minute session timeout
Thread.Sleep(120001);
Response.Write(String.Format("Session[\"Test\"] = {0}", Session["Test"]));
}
我在Cassini VS调试器和IIS 7 asp.net 4上进行了测试,在每次测试中,页面都加载了Session [“Test”] = Tester。我还尝试在睡眠期间手动回收应用程序池并获得相同的结果。
答案 1 :(得分:1)
这是我的代码,它运行正常......
protected void Page_Load(object sender, EventArgs e)
{
if (Session["id"] == null)
{
Session["id"] = "abc";
}
ViewState["id"] = Session["id"];
Label1.Text = ViewState["id"].ToString();
ViewState["id"] = Session["id"].ToString();
Label1.Text += ViewState["id"].ToString();
}
将“session”更改为“Session”,将“viewstate”更改为“ViewState”
答案 2 :(得分:0)
不,因为如果发生超时,你永远不会到达第5行。程序,服务等等都会停止运行。