ASP.NET会话大小限制

是否存在某种会话大小限制或不可超过的值?

在我的Web应用程序中,我创建了一些DataTable来存储用户选择,这些选择存储在会话中,直到用户批准选择,因此我将这些值添加到数据库中。

问题是我不知道会话是否足够可靠以保留少量对象?

谢谢!

更多信息

会话大小最大约为10-20KB。

是的,它足够可靠 。 它只是不太可扩展 ,所以提前计划。 当你在超过1台服务器上运行它时,这将完全停止。
并且有一个限制:并发用户数* SizeOf-Session

它当然取决于表的大小,通常可以接受存储几KB(尽管高流量站点会尝试将其保持较小)。

如果您的用户可以共享表,那么您可以将该数据放在Application对象中,这是一个很好的节省。

会话对象仅限于TimeOut设置,默认为20分钟。 优化内存消耗的一种方法是减少这种情况,但这是用户便利性的折衷。

以下是关于会话状态的一些注意事项:

  • InProc( mode="InProc" )会话状态仅限于工作进程可用的内存量。 仅存储对象引用,而不是对象本身。

进程外状态管理在持久化之前序列化对象:

  • 使用会话状态服务器( mode="StateServer" )的进程外状态管理仅限于状态服务可用的内存量。

  • 使用SQL Server( mode="SQLServer" )的进程外状态管理仅受SQL image数据类型的最大大小或数据库的最大允许大小限制。

显然,仍然需要有足够的内存可用于工作进程,以便能够将会话对象拉回内存并在http请求的持续时间内重新水合。

正如我之前提到的, 进程外状态管理在持久之前将对象序列化

这意味着对象必须是可序列化的,例如, XmlDocument或从MarshalByRefinheritance的任何东西都不能排除

尝试序列化此类对象将导致以下exception:

无法序列化会话状态。 在“StateServer”和“SQLServer”模式下,ASP.NET将序列化会话状态对象,因此不允许使用不可序列化的对象或MarshalByRef对象。 如果自定义会话状态存储在“自定义”模式下执行类似的序列化,则适用相同的限制。

我假设您正在以“inProc”模式存储会话。 在此模式下,ASP.NET应用程序的会话,缓存等存储在Web服务器的RAM中(通过aspnet_wp.exe进程)。 并且.NET没有全部使用它。 machine.config中有一个设置告诉阈值限制(默认为60%)。 达到此阈值后,IIS将回收工作进程,并且所有会话信息都将丢失。

请注意,如果您的服务器托管多个asp.net应用程序,则所有应用程序将共享60%的内存。 因此,如果累积内存使用量达到阈值,则工作进程仍会被回收。

除此之外,除了优化应用程序以节省使用会话之外,还可以将应用程序设置为在进程外模式下使用会话(使用stateserver或sqlserver存储会话信息)。

进程外模式可能会降低系统性能。

有关会话状态管理的更多信息,请参阅此文章。

你应该总是认为会话是一个非常有价值的存储,而且非常有限。 消耗应该尽可能少,因为您永远不会知道应用程序将支持多少用户。

DataTable可能太大而无法存储在会话中,除非它可以保持足够小。