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オブジェクトに格納すると、スクリプトを実行している現在のスレッドとセッションの間にアフィリエーションが作成されます。その結果、そのセッションに対する後続のすべての要求は、この特定のスレッドによってのみ処理される必要があります。そのスレッドが他の誰かの要求の処理でビジー状態になっている場合、使用可能な作業スレッドがたくさんある場合でも、セッション要求はキューに入れられます。したがって、セッションにオブジェクトを保存すると、アプリのスケーラビリティが大幅に損なわれる可能性があります。

すでに辞書になっているものに辞書を保存することの知恵にも疑問がありますか?

なぜユーザーだけではないのですか:-

Dim userID : userID = Session("user_id")

「id」など、通常は「user」ディクショナリに保存するものに、接頭辞「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 に答える