Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 将大对象存储到InProc会话,而不是在每个页面上重新加载_Asp.net - Fatal编程技术网

Asp.net 将大对象存储到InProc会话,而不是在每个页面上重新加载

Asp.net 将大对象存储到InProc会话,而不是在每个页面上重新加载,asp.net,Asp.net,这是我的第一个帖子/问题,请告诉我是否/如何改进。我发现了类似的问题,但没有什么能完全涵盖这一点 当您存储到InProc会话时,您只是存储对数据的引用。因此,如果我有一个公共属性foo,并且我将它存储在Session(“foo”)=foo中,那么我实际上没有占用任何额外的内存(除了指针使用的32/64位) 在我的例子中,我们目前正在网站的每个页面上重新加载foo,因此如果我将它存储在会话中,那么它应该占用相同的空间,但不需要在每个页面上重新加载。我看到很多人说不要在会话中存储大型对象,但是如果这

这是我的第一个帖子/问题,请告诉我是否/如何改进。我发现了类似的问题,但没有什么能完全涵盖这一点

当您存储到InProc会话时,您只是存储对数据的引用。因此,如果我有一个公共属性foo,并且我将它存储在Session(“foo”)=foo中,那么我实际上没有占用任何额外的内存(除了指针使用的32/64位)

在我的例子中,我们目前正在网站的每个页面上重新加载foo,因此如果我将它存储在会话中,那么它应该占用相同的空间,但不需要在每个页面上重新加载。我看到很多人说不要在会话中存储大型对象,但是如果这个大型对象已经存在,那么有一个指向它的指针又有什么区别呢?当然,当不再需要该对象时,我会将其从会话中移除

我们试图存储的数据是特定于用户当前工作的对象,而不是用户数据。打个比方,假设用户是一个汽车经销商,他正在查看某个特定客户的所有数据。我们为该客户提供了多个页面,我们希望在每个页面上加载所有客户信息,所有客户数据存储在SQL表中的单个xml数据列中,我们在每个页面上解析这些数据

我们尝试了二进制序列化而不是解析xml,因此可以在状态服务器模式下使用会话存储,但我们发现性能实际上更差


我们在单个web服务器上运行。

首先,否。当您在会话状态下存储某个对象时,存储该对象所需的所有数据都会被网站进程使用。NET将变量视为引用并不意味着它实际使用的内存比无GC语言少。这只是意味着,在不使用引用运算符或指针的情况下,可以高效地复制该变量

您的问题有点含糊,但您有几个选项可以保存数据:

1) 将数据作为JSON发送到客户端,并将其存储在浏览器上(如果应该是每个用户的数据,并且客户端比服务器端需要更多数据)。然后,若需要,您可以发送带有不同请求的数据片段(若必须使用ASPX web表单,则将其放在隐藏字段中)

2) 如果是少量的每用户数据,则将其存储在会话状态

3) 如果它较大且对所有用户都通用,请将其存储在ASP.NET缓存中,请参见此处()

4) 如果主要在服务器上使用的是大型的、特定于用户的,那么性能问题就更大了。您应该看看是否可以从静态内容中分离出任何特定于用户的内容。如果您这样做了,而且它仍然很大,那么数据库可能是一个不错的解决方案。如果您已经在应用程序中使用了DB调用,那么在每个请求上查找此数据不会导致太多开销,您也不必从头开始重新生成它(只有在生成数据需要相当长的时间时,您才应该这样做,因为DB调用可能比仅重新生成数据本身要慢)。我建议编写某种中间件(HttpModule或OwinMiddleware),它使用auth使用的任何用户标识来查找数据,然后在HttpContext.Current.Items集合上进行设置。通过这种方式,数据可用于整个请求,您可以在中间件中添加逻辑以确定何时进行设置

我认为拥有大量特定于用户的数据将是一个危险信号,因为用户数据应该只是一个列表,列出用户可以/不能做什么以及他们的偏好


如果这是静态数据,那么它非常简单。应用程序缓存就是您想要的。唯一的问题是,如果您有多台服务器需要同步数据

多谢各位。它很大,并且特定于用户当前的工作(不完全是用户数据)。目前,它已作为xml存储在数据库中。问题是解析hat-xml和创建对象的性能太慢。我们已经尝试过提高性能,但无法达到我们需要的程度。这将需要相当大的重构来提高加载对象的性能。我想我的问题是,如果我们已经为每个用户在每个页面上加载了那么多的数据,那么将其存储在会话中真的会对性能产生影响吗?如果是XML解析让您感到痛苦,您是否考虑过将解析的对象序列化为二进制流并将其存储在数据库中?重新加载的速度可能要快得多。NET提供了一些序列化接口。但是如果你只有几个用户,并且不担心扩大规模,那么会话可能不会对你造成太大的伤害。但是,让任何不更新对象的页面/处理程序使用只读会话状态。我们有大约2000个用户,通常一小部分用户在任何时候都处于活动状态。我已经将serialisaztion转换为二进制,但是该对象包含的对象太多了,因此要更新所有内容需要付出相当大的努力,以便我们能够做到这一点。每个页面都会更新对象,但是谢谢你提供的关于只读的提示。哦,它不允许我编辑,所以我只能自己更正。我们确实尝试过使用二进制序列化。它的性能不如我们的xml解析。要更新以使用内置的xml序列化(我们使用System.xml.Linq而不是xml序列化程序对其进行解析),需要花费大量的精力,因此我们不必费心测试它。无论如何,我无法想象它会比二进制序列化有更好的性能。我想我在内存方面说的是,就在这个特殊情况下,它似乎不会占用更多内存;只是内存会持续更长时间。只要代码在运行,这个对象就存在,所以如果我将它存储在会话中,这就意味着在服务器端代码完成运行后,数据仍然存在。因此,服务器t上的空间不是10mb