代码之家  ›  专栏  ›  技术社区  ›  ilivewithian

ASP.NET中的会话有什么问题

  •  1
  • ilivewithian  · 技术社区  · 15 年前

    我一直听说在会话中存储大型对象集合/任何东西都是不好的做法。通常在谈话过程中,它会很快地跟在后面:“只需关闭会话”

    那么会话的一般问题是什么呢?我对它们使用得很公平,因为它们的“真实”会话存储在强类型容器后面,所以我并不真正看到问题所在。

    9 回复  |  直到 11 年前
        1
  •  7
  •   Andrew Hare    15 年前

    会话没有任何问题-您只需要注意它的局限性。说“只需关闭会话”就是把孩子和洗澡水一起扔出去。

        2
  •  2
  •   Heiko Hatzfeld    15 年前

    在会话中存储大对象和小对象有很大的区别

    会话将在服务器上保持活动状态,直到它导出为止,这意味着这些大对象会污染您的可用内存。如果在负载下的服务器或运行许多应用程序池的服务器上执行此操作,那么这可能会导致问题。

    您不需要cookies来进行会话,因为asp-cal也将这些信息编码到URL中。此外,还可以将会话存储配置为耗尽进程,甚至将信息存储在SQL Server中(减少服务器上的内存负载,并启用服务器场中的会话)。

    所以基本上:物体是正常的-大的物体不是

        3
  •  2
  •   Steve Wortham    15 年前

    这是我的看法——疗程不错,但有时使用过度。当一个Web应用程序依赖于大量的会话时,理解它的流程也会变得更加困难,因此当然,您应该小心,不要过分激动。

    但是,只要需要存储临时数据以便跨多个页面访问,您就可以随时使用它们。在任何其他情况下都不应使用它们。但这种情况是专门为会议设计的。

    现在,如果您担心服务器上的内存消耗,这不一定是避免会话的原因。但这更可能是避免Inproc会话提供程序的一个原因。事实上,我不喜欢Inproc会话,因为它们在应用程序中经过一定数量的重新编译后往往会过早过期。

    我实际上更喜欢并且几乎总是使用SQL Server会话。他们会稍微慢一点,但好处很多。即使重新启动服务器,它们也会持续存在,这使得它们成为非常可靠的选择。当然,因为它们存储在SQL文件系统而不是内存中,所以它们不会对内存造成如此大的影响。

    This article on MSDN 讨论各种会话提供程序,并解释如何配置SQL来处理会话。如果没有SQL,只需知道即使是免费的SQL Server Express 2008也可以配置为会话提供程序。

        4
  •  1
  •   Matt Hamsmith Rahul Singh    15 年前

    我原以为这很大程度上取决于你网站的流量。如果您运行类似amazon.com的程序,试图将用户的购物车存储在会话中会占用大量的IIS分配内存,从而导致Web服务器停机。对于较小的网站,会话变量可以适度使用。

        5
  •  1
  •   M. Ryan    15 年前

    在会话中存储大型对象是不好的,是的,但“大型”是相对的。

    基本上,在会话中存储一个对象会将其保存在内存中,直到会话到期,所以如果您有一个用户数很高的站点,所有这些站点都在会话中存储巨型对象,那么您将很快杀死您的服务器。

    有了这一点,我们可以提出一个论点,即如果您的内存中有5K+的对象,并且有足够的用户实际限制了一台服务器,那么您无论如何都可能负担得起更多的硬件。

    还有一些主题,如服务器集群和集群中的框之间的会话完整性。有些框架处理这个问题,我不知道.NET是否处理。

        6
  •  1
  •   Locksfree    15 年前

    有两件事要小心:

    1. 内存消耗:如果您在会话中存储大型数据对象,并且有许多用户,则很可能会耗尽内存,或者至少会触发应用程序的许多早期回收。
    2. 只有当您有多个Web服务器(Web场)时,这才是一个问题:会话必须存储在外部(而不是进程中)的SQL服务器或Windows服务中,以便从不同的计算机访问。有时速度会很慢。
        7
  •  0
  •   ScottE    15 年前
    1. 会话要求用户打开cookie
    2. 如果你在一个网络农场工作,你会遇到麻烦的。

    我想这些原因与在会话中存储大型对象没有任何关系,只是在使用会话中。

        8
  •  0
  •   jkelley    15 年前

    我想到了两个主要问题… 1)当您开始扩展您的网站时,跨服务器持久化会话 2)会话状态下存储UI对象的内存使用激增

    更严重的问题是在会话中存储对象的倾向。当你在页面上存储一些像标签这样无害的东西时,你也会得到很多不需要的对象属性。您可能只是希望将标签的文本存储在会话中,但是随着它的出现,您会得到对页面本身的引用……突然之间,您有大量的内存用于存储页面、页面的视图状态以及服务器上内存中的许多不需要的属性。

    查看此链接 storing UI elements in session

        9
  •  0
  •   Community Ian Goodfellow    7 年前

    你可能想退房 this question 也。