【问题标题】:Can a session expire during the page processing in C#在 C# 中的页面处理期间会话是否会过期
【发布时间】:2012-08-15 14:47:59
【问题描述】:

我正在尝试解决会话 ID 在回发期间似乎神秘地清除的问题。我确定该值正在设置中,并且我的代码中没有其他地方可以清除该会话。此外,我将会话 ID 的值存储在我的页面视图状态中。在回发期间,视图状态为空,这实质上意味着当将值分配给视图状态时,会话变量为空。是否有可能在代码执行期间,会话对象因超时而被清除?

所以让我们说如果我有以下代码。

if (session["id"] == null)                                        :line1
{                                                                 :line2
   session["id"] = // Generate some unique id                     :line3 
}                                                                 :line4

viewstate["id"] = session["id"];                                  :line5

理论上是否有可能即使第 1 行中的 session["id"] 不为空,但由于超时,第 5 行为空。

【问题讨论】:

  • 您在页面生命周期的哪个阶段使用此代码(Page_Load 等)?
  • 是共享主机吗?它是一个长期运行的操作还是更多,介于两者之间?中间的操作平均需要多长时间?
  • 您是否尝试通过代码进行调试以检查各个断点处 session["id"] 的值?
  • @TimS.VanHaren:此代码在 page_load 中
  • 您是否将会话模式设置为“关闭”?

标签: c# asp.net .net


【解决方案1】:

我不得不说不。我刚刚创建了一个站点并将会话超时设置为 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 加载。我还尝试在睡眠期间手动回收应用程序池并得到相同的结果。

【讨论】:

  • 非常感谢 Zeph 提供了非常有用和确凿的证据,证明会话 ID 在页面处理期间不会清除。现在我可以专注于程序中可能导致该错误的其他部分。
【解决方案2】:

这是我的代码,它工作正常...

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

将“会话”更改为“会话”,将“视图状态”更改为“视图状态”

【讨论】:

    【解决方案3】:

    不,因为如果发生超时,您将永远无法到达第 5 行。程序、服务等将停止运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 2015-02-16
      • 2014-08-30
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 2018-04-29
      相关资源
      最近更新 更多