会话和存储对象

时间:2010-12-20 14:35:25

标签: c# asp.net session

如果将一个对象从会话(HttpContext.Current.Session)返回到对象类型的私有成员,然后修改它,例如您重命名属性或向对象内部列表成员添加内容。如果在另一个页面上您从会话中请求相同的对象,那么这些更改是否会保留...是否会使用上一页上更新的值进行更新。换句话说,对象是持久化的,或者在每个页面上更改任何内容后,您是否必须将对象重新保存回会话。任何帮助深表感谢。感谢

3 个答案:

答案 0 :(得分:2)

如果修改存储在会话状态的实例,则会修改实例 如果修改实例的副本,原始文件将不受影响。 (除非副本引用原件并更新它,这是不可能的)

答案 1 :(得分:2)

如果是实际对象,那么是,您正在修改会话维护的版本,它的值将被保存。

如果它不是引用类型,如String,那么你必须引用实际的会话值来修改它(即:session [“key”] = value)。

但是,我会提醒您不要在会话中存储真实对象。会话通过序列化和反序列化每个页面加载的值来工作。您投入会话的次数越多,框架在开始执行您的页面之前必须执行的工作量越多。

由于它的工作原理,您实际上只应将值放在整个站点中真正需要的会话中。

在考虑将某些内容放入会议之前,我会问自己以下几点:

  1. 这是整个网站还是靠近它需要的东西?
  2. 是否需要根据需要直接从数据库加载此信息,而不是从Web服务器内存中提取此信息?
  3. 此网站负载平衡或将来是否有可能实现负载平衡?
  4. 如果1为是,则使用会话是“可能”
    如果2是肯定的,那么会话也可能是,但我可能会使用不同的缓存机制 如果3是肯定的话我根本不使用会话(并完全关闭它)。负载平衡需要会话状态服务器,通常是sql server。这导致我们回到会话的初始问题:即,为每个单页请求加载和保存值。

答案 2 :(得分:1)

虽然你可以很容易地为自己测试这个,但答案是肯定的 - 对象将被保留!

存储在会话字典中的对象是通过引用存储的,这意味着如果更改对象的内部属性或结构(即,如果存储List<>对象并添加或删除项目),则这些更改将是保留。

话虽这么说,如果你存储一个值类型,如Int32或布尔值,那么如果你改变了值,你需要专门将它设置为Session。