【问题标题】:How does .NET session handling work? Sessions eat up all memory if cookies are disabled.NET 会话处理如何工作?如果禁用 cookie,会话会占用所有内存
【发布时间】:2010-10-29 03:02:50
【问题描述】:

在我的项目中,我已将 .NET 的会话配置为进入数据库。 我还有一个实现 Session_Start() 的 global.asax。 在 Session_Start() 中,我在会话中写了三件事:

  • 会话开始的时间。
  • 用户的主机地址。
  • 包装用户代理的可序列化设备对象。

现在的问题是不允许 cookie 的用户也不允许会话 cookie。 (通过将站点 URL 放入 IE 的受限站点,可以轻松重现)。

如果我继续刷新(按 F5),则会为每个请求创建一个新会话(-> 没有会话 cookie)。很快,Web 服务器进程增长到数百兆字节。 使用 IIS7 或 Cassini Local Webserver 都没有关系。

现在的问题是:在会话超时之前不会释放内存。如果会话真的应该进入数据库,这里的逻辑是什么? .NET 会将它们保留在内存中多久?最终,您甚至会遇到 Out Of Memory 异常!

有人知道吗?如何检测和预防此类(几乎是恶意的)“攻击”?

勒内

【问题讨论】:

    标签: asp.net session


    【解决方案1】:

    如果会话在这里的逻辑是什么 真的应该去数据库吗?

    谁说他们去数据库?如果那是您在 start stop 中的代码 - .NET 不知道它。所以它将它们保存在内存中。

    现在的问题是不允许 cookie 的用户不允许会话 cookie 要么

    我认为这有点不寻常。大多数阻止 cookie 的用户不会阻止会话 cookie。

    很快,网络服务器进程增长到数百兆字节

    没问题。就像“当它达到 1.5gb 时回来”。

    一般来说,.NET 会将会话保存在内存中,因为它们在内存中的访问速度比从数据库中访问要快得多。用户拒绝会话 cookie 是一个问题,但应该是罕见的。

    【讨论】:

    • 他们应该去数据库,因为我没有定义“进程中”会话,而是在 web.config 中定义数据库会话处理。即使这很不寻常,但我发现更不寻常的是,不接受 cookie 的客户端会导致运行 .net 项目的整个服务器停机。正如我所说:最终,Web 服务器将耗尽内存并进行回收。这是问题
    【解决方案2】:

    你为什么首先开始一个会话?看起来指定的信息应该在 cookie 中而不是会话中。通过这样做,您也将摆脱问题。

    仅使用会话来保持用户状态(登录后)。

    【讨论】:

    • 我不想讨论我为什么要这样做。这是一个测试。问题确实是:在 web.config 中,我设置了指定数据库会话状态。所以我假设在某个时候,.net 将开始使用该数据库,但它会继续将会话推送到内存中。为什么不交换?
    猜你喜欢
    • 2010-10-11
    • 2012-06-03
    • 2017-01-08
    • 2017-12-24
    • 1970-01-01
    • 2011-12-13
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多