调用Abandon()后,ASP.net MVC 5会话未清除

时间:2017-06-01 15:42:45

标签: c# asp.net asp.net-mvc model-view-controller asp.net-mvc-5

MVC noob在这里。

我目前有这个代码在通过AJAX加载页面时触发我的 HomeController

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 的输出为:

  

之前:35

     

之后:35

因此,您可以看到 35 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;
        }
    }
}

所以说的一切 - 我不知道为什么不清理会议......

2 个答案:

答案 0 :(得分:4)

很久以前,这也是一个让我在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个cookie。 ASP.NET中默认超时20分钟是一件非常糟糕的事情。在您的身份验证有效之前,您的会话数据不应过期。

另外,请注意您在会话中写的内容。
如果您只是存储用户信息,那很好。
但是如果你在那里存储状态信息,你就会遇到问题,因为我可以一次打开你站点的多个选项卡,然后tab2中的状态将覆盖tab1的状态。每个有一个会话,而不是每个标签一个会话。

答案 1 :(得分:2)

请查看this question以找到答案。

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