ASP.NET会话大小限制

时间:2010-05-16 09:48:52

标签: c# asp.net

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

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

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

谢谢!

更多信息

会话大小约为10-20KB。

4 个答案:

答案 0 :(得分:12)

以下是关于会话状态的一些注释:

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

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

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

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

显然,工作进程仍然有足够的内存可以将会话对象拉回到内存中并在http请求期间重新补充水。

正如我之前提到的,进程外状态管理序列化对象,然后再保留它们。

这意味着对象必须是可序列化的 排除 ,例如XmlDocument或从MarshalByRef继承的任何内容。

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

  

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

答案 1 :(得分:10)

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

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

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

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

答案 2 :(得分:2)

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

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

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

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

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

答案 3 :(得分:1)

您应始终假设会话是非常有价值的存储空间且非常有限。消费应该尽可能少,因为你永远不知道应用程序将支持多少用户。

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