会话变量迷路了?

时间:2010-09-22 15:49:38

标签: asp.net session logic global-asax

鉴于此Global.asax.cs:

using System;
using System.Web;

namespace Foo.Web {
    public class Global : HttpApplication {
        private const string IntroductionPageShownSessionKey = "IntroductionPageShownSessionKey";

        protected void Application_AcquireRequestState(object sender, EventArgs e) {
            ShowIntroductionIfNotYetShown();
        }

        private void ShowIntroductionIfNotYetShown() {
            if (HttpContext.Current.Session != null) {
                var introductionPageShown = Convert.ToBoolean(Session[IntroductionPageShownSessionKey]);
                if (!introductionPageShown) {
                    if (Request.Path.EndsWith("/Introduction.aspx")) {
                        Session[IntroductionPageShownSessionKey] = true;
                    }
                    else {
                        Response.Redirect("~/Introduction.aspx" + Request.Url.Query);
                    }
                }
            }
        }
    }
}
  1. 用户点击webapp并显示Introduction.aspx
  2. 用户继续使用webapp几分钟(ASP.NET_SessionId:ublbhu45ji31e055ywqu0555)
  3. 用户空闲(不执行任何回发)几分钟
  4. 用户执行回发
  5. 用户显示Introduction.aspx
  6. 用户的ASP.NET_SessionId cookie的第二次检查仍显示ublbhu45ji31e055ywqu0555
  7. 为什么用户在同一个ASP.NET会话中第二次显示Introduction.apsx?我很熟悉w / the risk in setting session variables just before a redirect in the same postback,但这不适用于此,对吧?

1 个答案:

答案 0 :(得分:0)

请记住,Session本身的生命周期可能比发送到浏览器的会话cookie和该cookie中设置的ID值短。实际上,浏览器可以继续提交旧的会话ID,如果旧的过期,服务器将接受它并从中创建一个新的会话。

影响是两种可能性: 1)由于超时配置值(我不知道你的特定实例中的情况)会话超时

2)我们在您的案例中通过对此问题的评论已经弄清楚:AppDomain正在关闭或被回收。