【问题标题】:Can I store a Scripting Dictionary in a session variable?我可以将脚本字典存储在会话变量中吗?
【发布时间】:2010-01-16 18:01:01
【问题描述】:

我有一个经典的 ASP 站点,当用户登录时我会在其中创建一个字典,然后将该字典存储在一个会话变量中,就像这样......

dim objDict
set objDict = server.createobject("scripting.dictionary")
' processing here to fill dictionary
set session("user") = objDict

这一切都很好,但当我导航到另一个页面并尝试从存储的字典中访问一个值时......

session("user").item("id")

我收到以下错误...

error '80020009'

谁能告诉我我是否错误地访问了存储的字典?将字典对象存储在会话变量中是一件坏事/错误的事情吗?

谢谢

【问题讨论】:

    标签: asp-classic dictionary session-variables


    【解决方案1】:

    您遇到的错误是远程过程调用错误。我无法解释为什么会出现此错误,或者为什么提取到局部变量中会修复它。

    但是我可以说这确实是个坏主意。当您将诸如此类的对象存储在 Session 对象中时,您会在执行脚本的当前线程和会话之间创建一个从属关系。因此,该会话的所有后续请求现在必须仅由该特定线程处理。如果该线程恰好忙于处理其他人的请求,即使有大量可用的工作线程可以使用,会话请求也会排队。因此,将对象存储在 Session 中会严重损害应用的可扩展性。

    我还质疑将字典存储在已经是字典的东西中是否明智?

    为什么不只是用户:-

    Dim userID : userID = Session("user_id")
    

    您通常会存储在“用户”字典中的任何内容(例如“id”)只是具有前缀“user_”并直接存储在 Session 中?

    【讨论】:

      【解决方案2】:

      当您想要访问代码时,您是否尝试过在代码中执行以下操作?

      Dim objDict
      Set objDict = session("user") 
      Response.Write objDict("id")
      

      试试看它是否有效。我认为这不是必需的,但 Classic ASP 并不是最强大的语言。你想做的应该是可行的,因为 Session 对象只是存储对象。

      【讨论】:

      • 什么时候释放这个对象?如果执行了 1000 个请求怎么办?
      • 好吧,如果你走这条路,你绝对应该在使用它之后立即调用 Set objDict = Nothing,或者如果你有一个“清理" 代码中的部分。虽然老实说,我确实喜欢 AnthonyWJones 下面的回答......实际上,这本字典中存储的任何内容都可以直接存储在会话中,一般来说。虽然,也许 OP 这样做是有原因的,但我不知道。
      • Set objDict = Nothing 在这种情况下并没有真正实现太多。
      • 好吧,它会释放变量的本地句柄,理论上应该在页面完成渲染时释放。但确实,根 Dictionary 对象仍然存在于会话对象中。理论上应该在会话结束时释放。