4

我的问题是有时我的会话会随机丢失,而有时它会起作用。

现在的问题是,是否有可能重现会话(我的会话是当前登录的用户)。我想也许我需要在我的母版页中更改某些内容,我现在只是检查会话是否失败,还有其他内容?

代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["UserId"] == null)
    {
        Response.ClearContent();
        Response.Write("Not agine");
        Response.End();
    }
    else
    {
        Response.Write(Session["UserId"].ToString());
    }
}

全球.asax

  void Session_Start(object sender, EventArgs e) {
        // Code that runs when a new session is started
        if (HttpContext.Current.User != null && HttpContext.Current.User is HtUser)
        {

            HtUser user = (HtUser)HttpContext.Current.User;
            Session["UserId"] = user.UserId;
            if (user.HtDepartments.Any() && user.HtDepartments.SingleOrDefault().HtBusinessUnit != null)
            {
                int BusinessUnitId = user.HtDepartments.First().HtBusinessUnit.BusinessUnitId;
                Session["BusinessUnnitId"] = BusinessUnitId;
            }

在这里你可以看到会话的代码

如果您需要更多信息,请告诉我!

感谢您的帮助和快速答复!

4

3 回答 3

2

你可以使用Session.Abandon方法

链接:http: //msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.abandon.aspx

于 2013-03-13T13:55:49.040 回答
1

如果我理解正确,用户会在会话过期(超时)时丢失会话。

为了防止这种情况,您可以在 cookie 中存储额外的密钥(即每个用户的 user_id 和 unique_hash),然后在 global.asax 文件中编写一个方法,该方法将触发每个页面加载,并检查会话是否过期。如果是这样,方法将使用 cookie 键通过检查它们来恢复会话。

global.asax 中的示例代码:

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
    if (HttpContext.Current.Session != null)
    {
        // Restore session if session is lost but cookie is not
        // HttpContext.Current.Session["user_id"] == null &&
        if (HttpContext.Current.Request.Cookies["hash"] != null)
        {
            // do your job here
            RestoreSessionMethod();
        }
    }
}
于 2013-03-13T13:17:28.403 回答
0

如果您将会话状态保存在内存中,而不是在 SQL Server 中,则可以打开页面执行将数据存储在会话中的操作,然后让浏览器保持打开状态并更改 web.config 文件或从命令行执行 iisreset.exe .

这将从内存中刷新您的会话状态数据,您将模拟会话状态的丢失。

于 2013-03-13T13:53:31.217 回答