【问题标题】:Delete only one variable from all session at once一次从所有会话中删除一个变量
【发布时间】:2016-05-02 14:43:50
【问题描述】:

假设我有一个这样的会话变量:

Session["Variable"] = "Assigned";

我可以为这样的一个用户删除这个变量

Session.Remove("Variable");

我可以从所有用户中删除这个变量吗?如果是,怎么做?

【问题讨论】:

  • 无法清除所有会话(如果不回收完整的应用程序池)。
  • 谢谢!不过,我已经在谷歌上搜索了两个小时。而且我认为您没有在这里找到问题。
  • @MethodMan:我不认为这很简单,因为不可能为所有会话删除会话变量。但无论如何,之前有人问过,f.e. herehere。可能与 ugly reflection approaches 一起使用,这可能与 inproc-sessions 一起使用。
  • @TimSchmelter 是的,解决方案是回收应用程序池,但它会删除所有会话。这些问题至少存在 3 年。我只是希望由于新的 .net 版本已经发布,可能会有解决方案。
  • @MethodMan:这是个好问题;)

标签: c# asp.net session session-variables


【解决方案1】:

我想提前回答你问“我可以...”。仅仅因为你可以,并不意味着你应该。另外,重申一下上述cmets,为什么要这样做?您的设计可能存在缺陷。除非您帮助我们理解,否则我们无能为力。

理论上可以用于 InProc 会话。但是,我不推荐它,因为它不适用于农场或会话解决方案。还有一些你需要注意的线程安全问题让我回到“为什么?”。

但是,我可以回答“我可以...”而不是“我应该...”这几乎让我畏缩给出答案。但是,使用此功能需要您自担风险,并且未经测试。

此外,如果您使用的是缓存服务器或其他会话状态服务器,则会将其扔出窗口。 在您的 Global.asax 或 IoC 容器中,您可以拥有类似于以下内容的集合:

protected void Application_Start(object sender, EventArgs e)
{
    Application["allSessions"] = new List<HttpSessionState>();
}

protected void Session_Start(object sender, EventArgs e)
{
    var allSessions= (List<HttpSessionState>)Application["allSessions"];
    sessions.Add(this.Session);
}

protected void Session_End(object sender, EventArgs e)
{
    var sessions = (List<HttpSessionState>)Application["allSessions"];
    sessions.Remove(this.Session);
}

然后您可以提取 allSessions 的会话变量,恕我直言,这是 hacky 并迭代它们。

再次,请阅读上述其他 cmets 的建议。请记住,给猫剥皮的方法不止一种。

【讨论】:

    猜你喜欢
    • 2016-11-30
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2012-05-14
    • 1970-01-01
    • 2015-01-28
    相关资源
    最近更新 更多