【问题标题】:Sessions and storing objects会话和存储对象
【发布时间】:2010-12-20 14:35:24
【问题描述】:

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

【问题讨论】:

  • 您不能“重命名属性”。

标签: c# asp.net session


【解决方案1】:

如果它是一个实际的对象,那么是的,你正在修改由 session 维护的版本,它的值将被保存。

如果不是引用类型,比如String,那么就得引用实际的session值来修改(即:session["key"] = value)。

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

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

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

  1. 整个站点都需要这个东西还是接近它?
  2. 根据需要直接从数据库加载此信息比从 Web 服务器内存中提取信息要多吗?
  3. 此站点是否已进行负载平衡,或者将来有可能进行负载平衡?

如果 1 是肯定的,那么使用 session 是一个“可能”
如果 2 是,那么 session 也是可能的,但我可能会使用不同的缓存机制。
如果 3 是肯定的,那么我根本不使用会话(并完全关闭它)。负载均衡需要一个会话状态服务器,通常是一个 sql server。这使我们回到了会话的最初问题:即,为每个页面请求加载和保存值。

【讨论】:

    【解决方案2】:

    如果您修改了存储在会话状态中的实例,该实例将被修改。
    如果您修改实例的副本,则原始实例不会受到影响。 (除非副本引用原件并对其进行更新,这是不太可能的)

    【讨论】:

      【解决方案3】:

      虽然您自己可以很容易地对此进行测试,但答案是肯定的 - 对象将被持久化!

      存储在 Session 字典中的对象是通过引用存储的,所以这意味着如果您更改对象的内部属性或结构(即,如果您存储 List 对象并添加或删除项目),这些更改将被保留.

      话虽如此,如果您存储了一个值类型,例如 Int32 或 Boolean,那么如果您更改了值,则需要专门将其设置为 Session。

      【讨论】:

        猜你喜欢
        • 2017-08-25
        • 1970-01-01
        • 2017-12-06
        • 2016-07-26
        • 2012-01-26
        • 2014-01-17
        • 1970-01-01
        相关资源
        最近更新 更多