2017-06-01 55 views
2

MVC noob here。ASP.net MVC 5 Session在调用Abandon之后未清除()

目前,我有这个代码,激发了我的的HomeController当通过AJAX页面加载:

namespace ETTData.Controllers 
{ 
    public class HomeController : Controller 
    { 
    [HttpPost] 
    public ContentResult clearSessions() 
    { 
     var currentSession = System.Web.HttpContext.Current.Session; 

     System.Diagnostics.Debug.WriteLine("BEFORE: " + currentSession.Timeout); 

     currentSession.Abandon(); 
     //currentSession.RemoveAll(); 
     //currentSession.Clear(); 

     System.Diagnostics.Debug.WriteLine("AFTER : " + currentSession.Timeout); 

     return new ContentResult { Content = "OK", ContentType = "text/plain" }; 
    } 
    } 
} 

的Debug.WriteLine的输出是:

BEFORE:35

AFTER:35

因此,大家可以看到它有在之前但也有为当它不应该,因为我用currentSession.Abandon等于什么();在调用该输出之前调用

我通过的Global.asax.cs文件中设置会话超时:

namespace ETTData 
{ 
    public class MvcApplication : System.Web.HttpApplication 
    { 
     protected void Session_Start(Object sender, EventArgs e) 
     { 
      HttpContext.Current.Session.Timeout = 35; 
     } 
    } 
} 

所以说所有 - 我不知所措,为什么它不清除会议...

回答

1

看看this question找到答案。

简而言之:Session.Abandon销毁会话,但不清除它的值。请求结束时会发生这种情况。 Session.Clear清除会话中的所有内容,但不会将其摧毁。

2

是的,这很好的让我在WebForms很久以前也一样。

问题是,您的会话被绑定到会话cookie。
Cookie在请求和响应头中传输,这意味着通过HTTP协议。 HTTP协议是无状态的,因此在发送响应之前它不能删除cookie。

当您调用session.Abandon时,会话数据将在cookie放弃在客户端的同时被放弃。这意味着框架将会话数据标记为“在发送响应之后将被清除”,该响应在response.end之后。在response.end(将在ContentResult.ExecuteResult之后调用),框架将清除会话。随后它将调用Session_End事件。

Session.Clear会立即删除项目,但不会删除会话cookie - 因此它也不会结束会话,也不会调用Session_End事件 - 这是因为它不会过期会话cookie 。

把它看作异步函数。
您已放弃,但尚未执行。
正如其他人告诉你的,如果您需要立即清除会话,请在session.abandon之后调用session.clear。

但是,如果您在拨打session.abandon之后开始另一个会话,则会遇到非常尖锐的刀。

基本上,你不应该使用会话。
如果要访问“会话”数据而不绕道数据库,则应该将信息存储在加密且不对称签名的cookie中,如果需要,可以将该信息绑定到会话生存期,但如果您不想不必。 Google JWT了解更多信息。我会将这些数据绑定到您的auth-cookie中。这样,就不需要> 1个饼干。 ASP.NET中默认的20分钟超时是一件非常糟糕的事情。您的会话数据不应过期,直到您的身份验证。