为什么在ASP.NET页面中,Session对象上的SessionID属性会在请求之间发生变化?
我有一个类似这样的页面:
...
<div>
SessionID: <%= SessionID %>
</div>
...
每次按下 F5 键,输出结果都会改变,与浏览器无关。
这就是原因。
使用基于cookie的会话状态时,ASP.NET在使用Session对象之前不会为会话数据分配存储空间。因此,在访问Session对象之前,每个页面请求都会生成一个新的会话ID。如果您的应用程序需要一个静态会话ID来维持整个会话,可以实现应用程序的Global.asax文件中的Session_Start方法并将数据存储在Session对象中以修复会话ID,或者您可以在应用程序的其他部分中使用代码显式地将数据存储在Session对象中。
http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx
因此,除非您在后端访问会话对象,否则每个请求都会生成一个新的sessionId。
编辑
这段代码必须添加到Global.asax文件中。它向Session对象添加一个条目,以便您可以固定会话直到过期。
protected void Session_Start(Object sender, EventArgs e)
{
Session["init"] = 0;
}
即使Session对象已经像Cladudio所演示的那样初始化,还有一个更隐蔽的原因可能导致这种情况发生。
在Web.config中,如果存在一个<httpCookies>
条目,该条目设置为requireSSL="true"
,但实际上您并未使用HTTPS来进行特定请求,则会导致会话cookie不被发送(或者也许没有返回,我不确定是哪一种情况),这意味着每个请求都会得到一个全新的会话。
我通过艰苦的摸索才发现了这个问题,花费了数小时在我的源代码控制中来回切换多次提交,最终找到哪个具体的更改破坏了我的应用程序。
www.
前缀,而我请求的页面没有www.
。www.
添加到URL中立即解决了问题。后来,我将cookie的域设置为.mysite.com
,而不是www.mysite.com
。if (HttpContext.Current.Response.Cookies.Count > 0)
{
foreach (string s in HttpContext.Current.Response.Cookies.AllKeys)
{
if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid")
{
HttpContext.Current.Response.Cookies[s].Secure = HttpContext.Current.Request.IsSecureConnection;
}
}
}
我遇到的问题出现在一个Microsoft MediaRoom IPTV应用程序中。结果发现MPF MRML应用程序不支持cookie;通过在web.config中更改为使用无cookie会话来解决我的问题。
<sessionState cookieless="true" />
http://server_name/app
,那么IE将阻止所有cookie,并且您的会话信息将无法在请求之间访问。HttpCookieCollection cookies = Response.Cookies;
for (int i = 0; i < cookies.Count; i++)
{
HttpCookie cookie = cookies.Get(i);
if (cookie != null)
{
if ((cookie.Name == "ASP.NET_SessionId" || cookie.Name == "ASP.NET_SessionID") && String.IsNullOrEmpty(cookie.Value))
{
//Try resetting the expiration date of the session cookie to something in the past and/or deleting it.
//Reset the expiration time of the cookie to one hour, one minute and one second in the past
if (Response.Cookies[cookie.Name] != null)
Response.Cookies[cookie.Name].Expires = DateTime.Today.Subtract(new TimeSpan(1, 1, 1));
}
}
}
someid
,会话ID将保持不变。请注意,此答案已经超过4年了,不确定是否有关于此方面的任何修改。 - Claudio Redi