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

Ste*_*hRT 5 c# asp.net model-view-controller asp.net-mvc asp.net-mvc-5

MVC菜鸟在这里。

当前,我有以下代码通过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" };
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

debug.WriteLine的输出是:

之前:35

之后:35

所以你可以看到它有35之前还有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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以说了这么多-我不知道为什么它没有清​​除会议...

Ste*_*ger 5

是的,这是一个很好的方法,很久以前我也开始使用 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 中,如果您愿意,您可以将其绑定到会话生命周期,但您不这样做不得不。谷歌JWT了解更多信息。我会将这些数据绑定到您的 auth-cookie 中。这样,就不需要 >1 个 cookie。ASP.NET 中 20 分钟的默认超时是一件非常糟糕的事情。在您的身份验证完成之前,您的会话数据不应过期。

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


And*_*mer 3

看看这个问题来找到你的答案。

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