3

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

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

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

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

我收到以下错误...

error '80020009'

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

谢谢

4

2 回答 2

7

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

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

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

为什么不只是用户:-

Dim userID : userID = Session("user_id")

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

于 2010-01-16T10:01:01.360 回答
2

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

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

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

于 2010-01-16T04:12:48.883 回答