2013-03-13 45 views
3

我的问题是,有时我的会话会随机丢失,而有时它会起作用。如何在asp.net/c#中重现丢失的会话?

现在的问题是,如果它是以某种方式重现会话(我的会话是当前登录的用户)。我想也许我需要在我的母版页中改变一些东西,我现在只是检查会话是否失败,其他的东西是什么?

代码:

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()); 
    } 
} 

的Global.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; 
      } 

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

如果你需要更多的东西只是让我知道!

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

+2

你是什么意思再现会话? – nunespascal 2013-03-13 13:11:15

+0

@nunespascal如果会话丢失我想给aktuell登录的用户返回会话 – Mingebag 2013-03-13 13:12:35

+1

你知道什么原因导致你失去会话;即它是一个超时,你是否与多个服务器一起工作(例如,会话在服务器A上创建,但下一个请求会发送到服务器B),您是否在使用查询字符串来标识会话,因此如果查询字符串是清除,还是别的? – JohnLBevan 2013-03-13 13:13:12

回答

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(); 
     } 
    } 
} 
+0

你可能有一些例子? – Mingebag 2013-03-13 13:18:22

+0

示例添加到回答 – 2013-03-13 13:21:50

+0

基本上我使用上面的方法恢复会话即使浏览器选项卡关闭后,因此用户不需要每次都登录。如果有帮助,请标记为答案或投票。谢谢 – 2013-03-13 13:52:43

0

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

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

+0

我从来没有听说过如何在SQL Server中保留一个会话,你可能有一个解决方案的例子吗? – Mingebag 2013-03-13 14:27:49

+0

我没有说你应该这样做,只是提到它是一种可能性。您可以在这里阅读更多关于它的信息:如何配置SQL Server以存储ASP.NET会话状态http://support.microsoft.com/kb/317604 – 2013-03-13 15:18:11