【发布时间】:2011-04-01 03:30:58
【问题描述】:
我了解到您可以将类直接存储到会话变量中,即
Session["var"] = myclass;
我的问题是内存管理是如何工作的。它会自动将其序列化到客户端的会话中吗?
或者它是否将类实例的数据保存在服务器内存中,并且只在会话对象中保存一个引用?
【问题讨论】:
-
Session与客户端无关。
我了解到您可以将类直接存储到会话变量中,即
Session["var"] = myclass;
我的问题是内存管理是如何工作的。它会自动将其序列化到客户端的会话中吗?
或者它是否将类实例的数据保存在服务器内存中,并且只在会话对象中保存一个引用?
【问题讨论】:
ASP.Net 会将您的对象存储在服务器内存中的static 嵌套字典中。
然后它使用会话 ID 向客户端发送一个 cookie。
下次客户端发送请求时,ASP.Net 将从外部字典中检索与该 ID 关联的会话,然后为您提供包含该会话中对象的内部字典。
(这是默认会话提供程序的工作方式;其他提供程序可以将对象序列化到 SQL Server,或者完全做其他事情)
【讨论】:
您不会在会话中存储类,而是这些类的实例。是的,默认会话存储是内存。但是,您也可以将 SQL Server 用作会话存储。然后会进行一些序列化。
会话数据在客户端不可用。
【讨论】:
这取决于您如何在 ASP.NET 中设置会话。默认是会话驻留在服务器的内存中,基本上只是一个字典。为用户提供了一个会话 cookie,用于识别为给定请求获取哪些会话字典(每个用户一个会话字典)
对象永远不会被发送到客户端,因为客户端只有一个 cookie,而 cookie 太小而无法容纳很多东西,而且除了向客户端发送对象之外,还可能存在安全问题。
您可以配置 ASP.NET 使用数据库而不是内存来存储会话,详细说明here
【讨论】:
默认会话存储在内存中。这是最容易使用的,因为对象不一定需要可序列化。
如果您将会话存储更改为 SQL SERVER 数据库。然后,您存储在会话中的所有对象都需要可序列化,否则它们将引发异常。
默认情况下,您的会话仅持续 20 分钟。您可以在 web.config 中将其更改为任意长度。但在该时间结束后,垃圾回收会将其从内存中删除。
【讨论】: