如何在代码中检测是否启用了会话而不是仅收到错误

时间:2018-11-08 09:01:13

标签: session vbscript asp-classic session-variables

如果我设置

@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 :(得分:4)

为了让这个问题显示出可接受的答案。...

关于使用isObject()方法的建议,结果并不理想。下面的asp ...

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

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

%>

产生

  

Microsoft VBScript运行时错误'800a01f4'

     

变量未定义:“会话”

     

/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