【问题标题】:ASP.NET - Storing Classes in Session Variables - How it works (memory)?ASP.NET - 在会话变量中存储类 - 它是如何工作的(内存)?
【发布时间】:2011-04-01 03:30:58
【问题描述】:

我了解到您可以将类直接存储到会话变量中,即

Session["var"] = myclass;

我的问题是内存管理是如何工作的。它会自动将其序列化到客户端的会话中吗?

或者它是否将类实例的数据保存在服务器内存中,并且只在会话对象中保存一个引用?

【问题讨论】:

  • Session与客户端无关。

标签: c# .net asp.net session


【解决方案1】:

ASP.Net 会将您的对象存储在服务器内存中的static 嵌套字典中。
然后它使用会话 ID 向客户端发送一个 cookie。

下次客户端发送请求时,ASP.Net 将从外部字典中检索与该 ID 关联的会话,然后为您提供包含该会话中对象的内部字典。

(这是默认会话提供程序的工作方式;其他提供程序可以将对象序列化到 SQL Server,或者完全做其他事情)

【讨论】:

  • 其实只有在使用默认的会话存储提供程序时才这样,你也可以使用SQL Server存储会话数据,以便在工作进程甚至机器之间共享。
  • 是的;这是一项更高级的功能。
【解决方案2】:

您不会在会话中存储类,而是这些类的实例。是的,默认会话存储是内存。但是,您也可以将 SQL Server 用作会话存储。然后会进行一些序列化。

会话数据在客户端可用。

【讨论】:

    【解决方案3】:

    这取决于您如何在 ASP.NET 中设置会话。默认是会话驻留在服务器的内存中,基本上只是一个字典。为用户提供了一个会话 cookie,用于识别为给定请求获取哪些会话字典(每个用户一个会话字典)

    对象永远不会被发送到客户端,因为客户端只有一个 cookie,而 cookie 太小而无法容纳很多东西,而且除了向客户端发送对象之外,还可能存在安全问题。

    您可以配置 ASP.NET 使用数据库而不是内存来存储会话,详细说明here

    【讨论】:

      【解决方案4】:

      默认会话存储在内存中。这是最容易使用的,因为对象不一定需要可序列化。

      如果您将会话存储更改为 SQL SERVER 数据库。然后,您存储在会话中的所有对象都需要可序列化,否则它们将引发异常。

      默认情况下,您的会话仅持续 20 分钟。您可以在 web.config 中将其更改为任意长度。但在该时间结束后,垃圾回收会将其从内存中删除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        • 1970-01-01
        • 2017-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多