【问题标题】:ASP.NET Session Keys expire after PostBackASP.NET 会话密钥在 PostBack 后过期
【发布时间】:2025-12-08 07:15:02
【问题描述】:

我是 ASP.NET 会话的新手,我注意到存储在 Session 中的会话密钥/变量在 PostBack 后过期。

在下面的代码中,在第一个页面加载期间,我将一些 XML 保存到 Session 键中。然后,如果用户单击网页上的单选按钮,则会导致 PostBack。在 PostBack 之后,与 XML 数据一起存储的 Session 变量现在为 NULL。

我认为这可能与 Session.Timeout = 60 有关,但我注意到即使用户在第一个页面加载的前 10 秒内单击单选按钮,Session 变量仍然为 NULL。

在下面的 doStuff() 中,xmlDoc 为 NULL。

public partial class InstallmentBillingPortal : System.Web.Ui.Page
{
    XmlDocument xmlDoc
    {
        get
        {
            return Session["xmlDocKey_3069"] == null ? null : (XmlDocument)Session["xmlDocKey_3069"];
        }
        set
        {
            Session["xmlDocKey_3069"] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        Session.Timeout = 60;

        if (!this.IsPostBack)
        {
            var xml = File.ReadALlText(Server.MapPath(@"request.xml"));
            xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xml);
        }
        else
        {
            doStuff();
        }
    }

    void doStuff()
    {
        if (xmlDoc != null)
        {
            // do something
        }
    }
}

【问题讨论】:

    标签: c# asp.net session


    【解决方案1】:

    存储在 SessionState 中的数据在用户关闭浏览器或会话超时之前可用。因此,您要检查xmlDoc == null 而不是IsPostBack

    不要在页面内设置 SessionState 超时。相反,您希望将其设置在 web.config 中。例如,60 分钟 -

    <configuration>
      <system.web>         
         <sessionState timeout="60"></sessionState>
      </system.web>
    </configuration>
    
    XmlDocument xmlDoc
    {
        get { return (XmlDocument) Session["xmlDocKey_3069"]; }
        set { Session["xmlDocKey_3069"] = value; }
    }
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (xmlDoc == null)
        {
            var xml = File.ReadAllText(Server.MapPath(@"request.xml"));
            xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xml);
        }
    
        doStuff();
    }
    

    仅供参考:如果您只想在回发期间保存数据,您可能需要考虑使用 View State

    【讨论】:

    • 我必须检查 IsPostBack,因为很多事情取决于它是否是第一次加载页面。如果是第一次加载页面,我们实际上会调用 WebService 来获取 XML 数据。使用接收到的 XML 数据,我们填充了许多网格、单选按钮、文本字段和其他控件。在 PostBack 上,我们处理用户输入,并响应任何触发的事件。所以我必须使用 IsPostBack 来做出这些决定。如果存储在 SessionState 中的数据在用户关闭浏览器或会话超时之前应该可用,那么为什么我的 SessionState 会在 PostBack 上消失?
    • 另外,我注意到我们的 Web.config 文件已经将 SessionState 超时设置为 10。这仍然比需要的时间长得多。即使在第一次页面加载后 5 秒后,我在 SessionState 中的变量也消失了。但是,我确实在那里看到了另外两个键。所以我不认为整个 SessionState 都消失了。也许只是我的变量?
    • 如果调用Session.Abandon,ViewState也会丢失吗?
    【解决方案2】:

    asp.net 提供文件名 global.asax,您可以在其中维护此类会话的值。尝试使用这些文件,因为它的范围直到页面的主会话到期。您将能够保持会话时间

    【讨论】: