【问题标题】:ASP.NET Session size limitationASP.NET 会话大小限制
【发布时间】:2010-05-16 09:48:52
【问题描述】:

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

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

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

谢谢!

更多信息

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

【问题讨论】:

  • 进程内还是进程外?

标签: c# asp.net


【解决方案1】:

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

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

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

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

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

显然,工作进程仍然必须有足够的可用内存才能将会话对象拉回内存并在 http 请求期间重新水合。

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

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

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

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

【讨论】:

  • 这如何回答这个问题?
  • 限制状态服务可用的内存量是什么意思?
  • @Liam - OP 显然还没有阅读会话状态管理。我正在解释可用的选项,这是一件坏事吗,用相关的相同主题信息扩展 OPs 知识?每第二个问题。状态服务是一个进程外服务,它将会话状态保存在内存中(不在磁盘或 SQL 数据库中),因此将受到作为进程可用的内存量的限制,如果您是在可能存在其他内存压力的机器上运行 32 位状态服务。
  • @Liam 这也是我一直在寻找的答案。目前,我的状态服务正在使用 850mb 的内存。
【解决方案2】:

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

这当然取决于表的大小,存储几 kB 通常是可以接受的(尽管高流量网站会尽量保持较小)。

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

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

【讨论】:

  • 谢谢,所以没有特殊的尺寸限制?我需要为每个用户存储几个 kbs。很少有小桌子,所以......会话超出了进程并且超时非常大。数据会一直存储到用户完成表单...因此无需长时间超时。
  • 我想用 ViewState 代替,但视图状态已经足够大,所以至少有一些数据来自服务器,一些来自页面数据。
  • 对 32 位应用程序池的一个明显限制是 1.3GB 的总虚拟内存使用量,您应该确保您的会话不会消耗太多。
  • @LexLi 此类限制是否适用于应用程序级别状态和 Web 缓存以及 32 位应用程序的情况?我相信应用程序级状态和 Web 缓存也会占用进程本身的主内存中的空间,唯一的区别是它们在访问权限方面不是用户范围的。不是吗?
【解决方案3】:

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

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

除了优化您的应用程序以减少使用会话之外,另一种方法是将应用程序设置为在进程外模式下使用会话(使用 stateserver 或 sqlserver 来存储会话信息)。

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

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

【讨论】:

    【解决方案4】:

    您应该始终假设 session 是一个非常有价值的存储空间并且非常有限。消耗应尽可能少,因为您永远无法知道应用程序将支持多少用户。

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

    【讨论】:

    • 谢谢,但我知道我需要尺寸,至少需要一些基本规则。不只是尽可能小。
    • @eugeneK Mine 目前位于 850Mb。所以至少这么多。
    • @TomasBeblar 您的回复将不胜感激,您是否设法在会话中存储了这么多大小的数据,即大约850MB,你是如何设法在会话或任何替代解决方案中存储这种大小的临时数据的?
    • @yadavr 在网络农场模式下运行多个站点,大约有 15 个进程共享状态服务器。目前在状态服务上使用 450mb 内存。到目前为止没有问题。
    猜你喜欢
    • 2011-10-11
    • 1970-01-01
    • 2011-08-29
    • 2020-05-04
    • 2019-07-09
    • 1970-01-01
    • 2018-06-10
    • 2011-01-07
    • 2021-01-25
    相关资源
    最近更新 更多