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
,因为它可能从未提供过该页面。在网络场中,您可能希望使用其他来源来存储与会话相关的数据,例如数据库或文件等。
我的会话密钥是一个 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
,因为它可能从未提供过该页面。在网络场中,您可能希望使用其他来源来存储与会话相关的数据,例如数据库或文件等。