PostBack上的ASP.NET const字符串会话密钥丢失

时间:2016-12-23 18:34:29

标签: c# asp.net session session-variables

我的会话密钥是 const 字符串变量。见下文。

在第一页加载时,我使用此键向会话添加一个字符串。我还在第一次加载和每次PostBack上向KeepAlive指示键。但是,在PostBack上,我注意到密钥不再出现在会话中。

我发现要修复这个,我只需要从变量中删除“const”,一切正常。

有人可以解释并提供有关为何发生这种情况的任何教育资源。

private const string ENTITY_KEY = "c335a928-72ac-4403-b5f8-418f1e5ac1ec";

public string CurrentEntity
{
    get { WebClientSession.Current[ENTITY_KEY] as string); }
    set { WebClientSession.Current.AddTransient(ENTITY_KEY, value); }
}

protected void Page_Load(object sender, System.EventArgs e)
{
    string key = (string)Request["Id"] + "";
    CurrentEntity = Mapper.Lookup.FindById(key);

    WebClientSession.Current.KeepAlive(ENTITY_KEY);
}

private void _bindGrid()
{
    ...
    // CurrentEntity is null here on PostBack. Good on first load.
    ...
}

1 个答案:

答案 0 :(得分:1)

我不确定WebClientSession是什么,但HttpSessionState适用于const。它没有理由不起作用。以下是它将起作用的证据:

private const string ENTITY_KEY = "c335a928-72ac-4403-b5f8-418f1e5ac1ec";

protected void Page_Load(object sender, EventArgs e) {
      if( !this.IsPostBack ) {

      Session.Add( "ENTITY_KEY", ENTITY_KEY );
   }

}

protected void Button1_Click(object sender, EventArgs e) {
   string s = Session[ "ENTITY_KEY" ].ToString();
}

我只是在表单中添加了一个按钮。在load方法中,如果正在请求页面,我将const变量的内容添加到Session。在按钮的点击处理程序(即发布的表单)中,我从Session访问它,它就在那里。

那么为什么它不适合你呢?

有两个可能的原因:

原因1

问题出在您的WebClientSession课程中。我不知道那个课程的细节,所以不能说出问题所在。

原因2

Session存储在服务器的内存中。因此,如果此站点部署在服务器场中,则最初为该页面提供服务的服务器可能会将ENTITY_KEY添加到Session。但是当页面在按钮单击时回发时,另一台服务器会提供请求。此服务器的内存中可能没有ENTITY_KEY,因为它可能尚未提供该页面。在Web场中,您可能希望使用其他源来存储与会话相关的数据,例如数据库或文件等。