2011-12-11 90 views
0

嗨,ASP.NET MVC处理

在我的ASP.NET MVC页面的登录方法看起来是这样的:

Check ModelState 
Check Username and password 
user = accountModel.GetUser(model.UserName); 
this.HttpContext.Session[Biss.Extensions.SessionKey.userContext.ToString()] = new UserContext() { SiteRole = (SiteRoles)user.RoleId, Id = user.Id }; 
FormsAuthentication.SetAuthCookie(model.UserName, createPersistentCookie); 

在发展林改造,重新启动的很多解决方案次,我有注意以下几点:

  1. 入门网站
  2. 登录(与上面的方法)
  3. 重建soultion
  4. 重新启动网站

现在User.Identity.Name仍将被确定,但

HttpContext.Session[Biss.Extensions.SessionKey.userContext.ToString()] 

为空?我建议网站在重建/重新启动时重新启动,但User.Identity.Name如何设置?我怎么能处理这个?

BestRegards

+0

您是否也重新启动浏览器?或者它有可能将某种陈旧的cookie传递给应用程序? –

+0

@ MerlynMorgan-Graham>不,我没有重新启动浏览器,我认为会员使用一些cookie的这个? – Banshee

+0

之前没有调试过这样的问题,所以我很幸福地没有意识到这个问题的答案:)但是这是需要检查的。 –

回答

2

由于您重新启动AppDomain,会话将被删除,因为它存储在内存中。想想看,生产服务器中可能会发生完全相同的事情。在某些情况下,IIS可以简单地重新启动应用程序池:例如,在达到某个不活动或内存/ CPU阈值后。为避免丢失会话数据,您可以使用进程外会话存储,以便它不会留在内存中。看看下面的文章为不同的可能性:http://msdn.microsoft.com/en-us/library/ms972429.aspx

0

当你重新启动该网站,你冲洗掉你会话。会话的状态完全消失了。

我建议摆脱使用会话为用户登录等简单的情况。我的一般答案几乎无处不在 - 如果您有非常严重的理由,请使用会话。

您可以将有关用户的信息保存在数据库中并读取,而不是实际需要。

+0

但是这个信息可以在不同的方法中使用多次,我建议我可以在方法之间传递用户信息?这真的是更好的解决方案吗? – Banshee

+0

马比用户信息singelton可能是一个更好的方法? – Banshee

+0

它比Session好。如果你需要这几个地方,可以考虑创建一个MVC过滤器,它可以读取这些信息并做一些事情。例如根据用户角色允许/禁止访问操作等。 –