Можно ли сохранить словарь сценариев в переменной сеанса? - PullRequest
2 голосов
/ 16 января 2010

У меня есть классический ASP-сайт, где я создаю словарь, когда пользователь входит в систему, а затем сохраняет этот словарь в переменной сеанса, например ...

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

Это все прекрасно работает, но когда я перехожу на другую страницу и пытаюсь получить доступ к значению из сохраненного словаря, как это ...

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

Я получаю следующую ошибку ...

error '80020009'

Может кто-нибудь сказать мне, если я неправильно обращаюсь к сохраненному словарю? Хранение объекта словаря в переменной сеанса - это плохо или неправильно?

Спасибо

Ответы [ 2 ]

5 голосов
/ 16 января 2010

Вы получаете ошибку удаленного вызова процедуры. Я не могу объяснить, почему вы получаете эту ошибку или почему извлечение в локальную переменную исправляет ее.

Однако я могу сказать, что это действительно плохая идея. Когда вы сохраняете такой объект в объекте Session, вы создаете связь между текущим потоком, выполняющим скрипт, и сессией. В результате все последующие запросы для этого сеанса теперь должны обрабатываться только этим конкретным потоком. Если этот поток занят обработкой чужого запроса, запрос сеансов ставится в очередь, даже если имеется множество доступных рабочих потоков, которые можно использовать. Следовательно, сохранение объекта в сеансе может значительно повредить масштабируемости приложения.

Я бы также усомнился в целесообразности хранения словаря в чем-то, что уже является словарем?

Почему не просто пользователь: -

Dim userID : userID = Session("user_id")

Где все, что вы обычно сохраняли бы в словаре "user", например, "id", просто имело бы префикс "user_" и сохранялось непосредственно в сеансе?

2 голосов
/ 16 января 2010

Вы пытались в своем коде сделать что-то вроде следующего, когда вы хотите получить к нему доступ?

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

Попробуйте и посмотрите, работает ли это. Я не думаю, что это будет необходимо, но Classic ASP не был самым надежным языком. То, что вы хотите сделать, должно быть работоспособным, так как объект Session просто хранит объекты.

...