我将运行在.NET 1.1服务器上的ASP.NET站点移动到另一台运行.NET 2.0的服务器上。
在其中一个页面中,我有以下代码来检测过期的会话:
protected void Page_Init(object sender, System.EventArgs e) {
if ( Session["XBCPEmail"] == null ) {
Response.Redirect("signin.aspx?expired=yes");
return;
}
}
(会话[“XBCPEmail”] == null)在单击其中一个按钮后,在一个意外情况下解析为true(就像会话已过期一样)。它只发生在其中一个按钮上。就像同一页面中的其他按钮一样,按钮事件处理程序以此代码重定向到同一页面结束:
Response.Redirect("cpanel.aspx");
我检查过Response.Redirect("cpanel.aspx");
时(string)Session["XBCPEmail"]
的值是有效字符串,所以我不确定Response.Redirect
和{{1}之间会发生什么这可能会使Page_Init
变为空。
哪个可以使.NET 2.0中的Session变量变为空?此代码在1.1中没有该问题,即使在2.0中,它也仅影响页面上的一个按钮。
更新:仅当按钮事件处理程序使用下面的代码调用外部.exe程序时才会出现此问题。如果注释掉此代码,则Session变量不为null。如果Session变量为null,创建运行命令行程序的外部进程有什么影响呢?
Session["XBCPEmail"]
更新2 :在使用IIS 7.5计算机的Windows 2008 R2上安装.NET 4.5后,问题已经消失,而不是使用默认情况下使用的那个,即.NET 2.0。
答案 0 :(得分:9)
默认情况下Response.Redirect
终止线程执行,并且在设置会话变量时可能存在竞争条件。它在文章Don't redirect after setting a Session variable (or do it right)中有所描述,因此请尝试使用另一个不那么暴力的版本:
Response.Redirect("cpanel.aspx", false);
答案 1 :(得分:7)
检查你的web.config,也许你有这个标签
<httpCookies requireSSL="true" />
如果是这样,请将其删除。
答案 2 :(得分:1)
我相信您正在重置web.config中的会话(为每个回发获取一个新的SessionID)
您可以尝试使用
将SessionID放在页面上的某个位置(用于测试)来调试此操作HttpContext.Current.Session.SessionID
这确实发生在我的一个网站上,我所要做的就是进入IIS并重新启动SessionState面板
答案 3 :(得分:1)
在重定向之前设置Session变量时遇到此问题。我在Web.config中有 enableSessionState =&#34; ReadOnly&#34; 。这是因为会话不存在,并且重定向发生在客户端可以设置会话cookie之前。
我的解决方案是在上一页加载中设置一个虚拟Session变量(在我的情况下是登录页面)。
protected void Page_Load(object sender, EventArgs e)
{
// Put this in master page or login page
Session["createSession"] = true; /* ensure there's a cookie for session */
}
答案 4 :(得分:1)
我遇到了同样的问题,并尝试了上述答案中提到的每个选项。 最终发现问题是我们在项目中将会话cookie标记为安全,但正在使用http运行它 如果尚未为SSL设置服务器,并且您尝试将cookie标记为安全,则将为每个请求生成一个新会话。 所以最后启用back https为我修复了它。
答案 5 :(得分:0)
您需要更新web.config,如下所述:
<httpCookies requireSSL="false" />
答案 6 :(得分:0)
只需转到您的web.config文件并编辑您的sessionstate标记即可。将requiressl设置为false为true。
答案 7 :(得分:0)
<httpCookies requireSSL="false" />
从本地web.config中删除它对我有用。问题只发生在本地运行应用程序时。
答案 8 :(得分:0)
对于MVC,请确保web.config具有以下配置。
<httpCookies httpOnlyCookies="true" requireSSL="false" />
在<system.web>
部分