Как в коде определить, включен ли сеанс, а не просто получить ошибку - PullRequest
0 голосов
/ 08 ноября 2018

Если я установлю

@ENABLESESSIONSTATE = false

затем

session("foo") = "bar"

тогда результат

Ошибка выполнения Microsoft VBScript '800a0114'
Переменная не определена 'Session'
... файл и строка №

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

Однако в определенном наборе обстоятельств у меня есть случай, когда фрагмент кода, который использует сеанс, всегда вызывается первым при каждом запросе страницы. Это связано с мониторингом производительности.

Этот код включает в себя форк - если у пользователя есть сеанс, мы идем одним путем, если нет, мы идем другим.

Но, конечно, когда пользовательский сеанс отсутствует, потому что мы ввели некоторый код, который выполняется с отключенным сеансом, мы получаем сбой.

Я мог бы решить это с

on error resume next 
session("foo") = "bar"
if err.number <> 0 then

   ' do the no-has-session fork

else

   ' do the has-session fork
end if
on error goto 0

Но мне было интересно, есть ли менее хакерский подход.

1 Ответ

0 голосов
/ 09 ноября 2018

Ради этого вопроса покажите принятый ответ ....

Что касается предложений по использованию подхода isObject (), результаты не очень хорошие. Следующий жерех ...

<%@EnableSessionState=False%>
<% option explicit

response.write "session enabled=" &  IsObject(Session) 
response.end

%>

Результаты в

Ошибка выполнения Microsoft VBScript '800a01f4'

Переменная не определена: 'Session'

/ errortest.asp, строка 6

Поэтому может показаться, что объект сеанса помечен как действительно не объявленный.

Мое заключение состоит в том, чтобы построить функцию, как показано ниже.

<%@EnableSessionState=False%>
<% option explicit

response.write "session enabled=" &  isSessionEnabled()  ' <-- returns false 
response.end

function isSessionEnabled()
    dim s

    isSessionEnabled = true     ' Assume we will exit  as true - override in test 
    err.clear()                 ' Clear the err setting down
    on error resume next        ' Prepare to error

    s = session("foobar")       ' if session exists this will result as err.number = 0 

    if err.number <> 0 then 
        on error goto 0         ' reset the error object behaviour                  
       isSessionEnabled = false ' indicate fail - session does not exist.
       exit function            ' Leave now, our work is done
    end if
    on error goto 0             ' reset the error object behaviour
end function                    ' Returns true if get to this point

%>

Это затем используется как

If isSessionEnabled() then
    ' do something with session 
else
    ' don't be messin with session.
end if
...