ASP.NET const string 会话密钥在 PostBack 上丢失

ASP.NET const string session key lost on PostBack

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

在首次加载页面时,我使用此键向会话添加了一个字符串。我还在第一次加载和每次回发时指示 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.
    ...
}

我不确定 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();
}

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

为什么它对你不起作用?

有两个可能的原因:

原因 1

问题出在您的 WebClientSession class 中。我不知道那个 class 的细节,所以不能说出问题是什么。

原因 2

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