C# 用于存储所有全局数据的asp.net会话变量

C# 用于存储所有全局数据的asp.net会话变量,c#,asp.net,session,C#,Asp.net,Session,我从一个非常喜欢会话变量的开发人员那里继承了一个项目。他用它们来存储各种各样的全局数据——数据表、数据集、文件位置、连接字符串等。我有点担心这可能不是很好的可扩展性,我们确实有可能在不久的将来拥有更多的用户 我担心对吗?如果是,为什么? 有没有一种简单的方法可以查看目前在live server上使用了多少内存? 为了使用更好的解决方案,最好的方法是什么?会话总是会损害可伸缩性。然而,一旦使用了会话,会话中稍微多一些数据的影响就没那么糟糕了 但是,它必须存储在某个地方,必须从某个地方检索,所以它会

我从一个非常喜欢会话变量的开发人员那里继承了一个项目。他用它们来存储各种各样的全局数据——数据表、数据集、文件位置、连接字符串等。我有点担心这可能不是很好的可扩展性,我们确实有可能在不久的将来拥有更多的用户

我担心对吗?如果是,为什么? 有没有一种简单的方法可以查看目前在live server上使用了多少内存?
为了使用更好的解决方案,最好的方法是什么?

会话总是会损害可伸缩性。然而,一旦使用了会话,会话中稍微多一些数据的影响就没那么糟糕了

但是,它必须存储在某个地方,必须从某个地方检索,所以它会产生影响。如果你不得不迁移到一个web服务器场来处理非常成功的问题,那将是非常痛苦的,因为以可伸缩的方式很难做好这件事。我会从真正意义上的全局性(在所有会话之间共享)开始,并将其移动到一个真正的全局可访问位置

那么任何依赖于前一个请求的东西,我都会被该请求发送


这两种方法都可以极大地减少它们的使用量(可能足以关闭会话并获得巨大的可扩展性提升)。

这可能是由于设计不佳,是的,如果您计划增加流量或扩展站点,您应该担心。

连接字符串应存储在
web.config
中。似乎您必须重新设计数据层以及页面如何相互传递数据,以避免在会话中存储数据表和数据集。例如,不是将整个数据集存储在会话、存储或传递url中,而是可以用于重新查询数据库的小数据集(如ID)。

根据IIS版本,使用会话存储状态可能会影响扩展。IIS的更高版本更好。
然而,我遇到的主要问题是会话过期,然后数据丢失;您可以在可以重新生成会话的地方提供自己的会话和处理程序。

您对此的担忧是正确的

连接字符串应存储在Web.config中,并始终从那里读取。
Web.config
文件是缓存的,因此将内容存储在其中然后在
Session
上是多余和不必要的。对于文件的位置也可以这样说:您可能可以在web.config的
appSettings
部分中创建键、值对来存储此信息

至于存储数据集、数据表等;如果从数据库获取这些信息非常昂贵并且数据不太大,我只会将这些信息存储在会话中。很多人倾向于做这种事情,而没有意识到他们的查询速度非常快,数据库连接是共用的

如果从数据库中获取数据确实需要很长时间,那么我要做的第一件事就是提高查询速度。我是否缺少索引?我的查询的执行计划显示了什么?我在做表格扫描等等

我当前在
会话
(或
缓存
)上存储信息的一种情况是,我确实需要调用一个外部web服务来检索我所需的信息,平均需要2秒以上。一旦我得到了这些数据,我就不需要在每次点击的页面上再次获取,所以我将其缓存


显然,如果一个应用程序在
会话
上几乎存储了它所能存储的所有内容,那么它将面临可伸缩性问题,因为内存是一种有限的资源

总的来说,是的,你应该关注这一点

会话是内存中的“每用户”类型的存储。查看ASP.NET Worker进程的内存使用情况可以让您了解内存使用情况,但如果您想更深入地了解其中的内容,可能需要使用第三方工具。此外,当您开始负载平衡等时,会话会变得非常“有趣”

并非“每用户”的连接字符串和其他信息实际上不应在“每用户”存储位置中处理


但是,要为此创建一个解决方案,很大程度上取决于数据本身,因为您可能需要找到多个其他机会/位置来获取/存储信息

是的,我想说你确实有理由担心。过度使用会话会导致许多性能问题。理想情况下,会话应该只用于特定于用户的信息。显然,这条规则也有例外,但在重构时请记住这一点


至于重构本身,我将研究缓存任何不特定于用户的大型对象,并删除任何不需要在会话中的对象。当您需要信息时,不要害怕访问数据库以检索信息。选择对服务器的总体压力最小的选项。诀窍是保持它的平衡,并将权重尽可能均匀地分布在应用程序的各个层上

如果内存是个问题,为什么不将会话模式更改为sql server,这样您就可以在sql server中存储会话数据,而只需要很少的代码更改

如何在sql server中存储会话数据:


问题是存储在sql server中的类必须是可序列化的,您可以使用json.net来实现这一点。

我认为我的答案与这里的任何其他答案都不相似。答案中有一些共同的建议,但我的答案作为一个整体是完全不同的。如果我觉得提供的答案不完整,或者我觉得我可以贡献一些独特的东西,那么我会发布一个答案。老实说,我不太确定你的评论是如何应用的。系统地解析每个人的答案,提取片段,然后进行分析