2008-12-02 38 views
8

我们正在尝试决定如何处理跨回发的对象持久性,以避免在每个请求中从数据库获取数据,并且倾向于使用Session(这是一个Intranet应用程序,不会有成千上万的用户) ,但是这是由于这样的事实,我怀疑只有参照实物储存在那里...真正存储在ASP.NET中的Session中的内容是什么?

有谁知道,如果这是真的事实吗?

我总是被教导不要过度使用session对象,但如果是这样工作就不会真正成为一个大问题......

什么是真正存储在会话这里:

Session["myKey"] = myObject; 

实际序列化的对象,或者它的引用?

回答

7

我已经试过这样:

我创建了一个类,并存储该实例中的会话(会话状态模式:是InProc)。实例位于aspnet_wp.exe进程中。

然后,我改变的会话状态到SQL Server(仍然没有[Serializable]属性),我有以下错误。

无法序列化会话状态。在'StateServer'和'SQLServer'模式下,ASP.NET将序列化会话状态对象,因此不允许使用不可序列化的对象或MarshalByRef对象。

所以,没有序列化进程内会话状态。

干杯...... 马丁

4

ASP.NET创建默认保存在cookie中GUID(但你可以指定使用的查询字符串)来识别用户。与该cookie关联的对象默认存储在IIS进程中的服务器上。

您还可以创建自定义会话对象存储(会话状态存储供应商),例如,如果你想保持会话对象外的过程。

此处了解详情:

http://msdn.microsoft.com/en-us/library/ms178587.aspx

但实际上回答你的问题......

开箱即用,你是在假设是正确的,该会话存储只存储一个参考物体。

虽然,你可以指定在web.config我相信会议功能的存储行为,实现系列化了。这3种模式:

  • InProc - 会话在Web服务器(aspnet_wp.exe)中保持为活动对象。使用“无Cookie”配置web.config中“Munge时间”的SessionID到URL(解决饼干/域/路径RFC问题呢!)
  • 的StateServer - 会话系列化并存储在内存中的一个单独的进程(aspnet_state.exe的) 。状态服务器可以在另一台机器
  • 的SQLServer上运行 - 会议序列化,并存储在SQL服务器

以上是从:http://www.eggheadcafe.com/articles/20021016.asp

4

这取决于你用什么会议,如果你使用的是InProc会话你做在会话中引用引用,但是引用它自身只是指向对象的链接,它将整个对象保存在进程内存中,因此当您设计应用程序时,非常希望知道每个用户将拥有多少数据以及多少活跃用户每小时都会有。如果您在proc会话中使用proccess会话时,proccess内存中的对象不会被序列化,但如果您使用proc会话,则它会被序列化,它可以具有性能实现。

我想在这里你可以找到很好的overview of session and cache

+0

这也是我所想的,有没有什么办法来测试它? – juan 2008-12-02 19:45:59

+0

您可以使用内存分析器来检查这种行为,但我想emphises什么存储对象insid进程内会话increaing内存消耗,如果刨去共享数据进行的跨不同的用户,最好在缓存 – MichaelT 2008-12-02 19:52:11

+0

使用.NET打造什么内置缓存? HttpResponse.Cache由所有用户共享 - 就像Application对象缓存一样。 – 2008-12-02 20:03:10

0

要记住,在进程内会话数据是相当脆弱的...这意味着它可能不会在那里当你最需要的是很重要的。如果工作进程因任何原因回收poof它已经消失。

+0

没关系的链接...我会去再取吧...我们的目标是避免做它的每一次 – juan 2008-12-02 20:02:57

0

我明白你没有很多性能方面的问题,现在和会话可能会工作得很好;然而,还有其他方式来维护状态或通过回传来传输数据。

如果你想跨越同一页面的回传持久化数据,那么我会建议使用ViewState的替代。请注意,存储在ViewState中的数据将被序列化,并且任何要保留的对象都必须实现ISerializable。

2

有吨的会话变量哀叹使用存储复杂对象的文章和博客文章(技术上存储引用说的对象)。一般来说,我认为会话变量是魔鬼的工作,并尽我所能避免它们。

这就是说,对于一个企业内部网部署的应用程序,其中开发人员充分了解过度使用会话的会话作为胡安·曼努埃尔介绍的可伸缩性的影响,我已经做了很多次,取得了巨大成功。是的,会话可以回收,但这是一个不寻常的边缘案例 - 这种情况不会经常发生,不足以影响浏览器应用程序,并导致会话超时。

我想说构建应用程序,你建议的方式,胡安·曼努埃尔,至少在第一。但松鼠离开你正在保存的地方,并从会话中获取对象(可能还有一个包装类),以便应用程序需要时,稍后可以很容易地进行更改。

相关问题