我的会话密钥是 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.
...
}
答案 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场中,您可能希望使用其他源来存储与会话相关的数据,例如数据库或文件等。