如何在代码中检测会话是否已启用而不仅仅是收到错误
How in code to detect if session is enabled rather than just get an error
如果我设置
@ENABLESESSIONSTATE = false
然后
session("foo") = "bar"
那么结果就是
Microsoft VBScript runtime error '800a0114'
Variable is undefined 'Session'
... file and line no
这通常表示关于程序流程的错误假设,我会跟踪并解决问题。
但是,在一组特定的情况下,我遇到这样一种情况,即在每次页面请求时始终首先调用一段使用会话的代码。它与性能监控有关。
此代码包含一个分叉 - 如果用户有一个会话,我们将采用一种方式,否则我们采用另一种方式。
当然,如果用户会话不存在,因为我们引入了一些在禁用会话的情况下运行的代码,我们就会崩溃。
我可以用
解决
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
但我想知道是否有更简单的方法。
为了让这个问题显示一个可接受的答案....
关于使用 isObject() 方法的建议,结果并不好。以下asp...
<%@EnableSessionState=False%>
<% option explicit
response.write "session enabled=" & IsObject(Session)
response.end
%>
结果
Microsoft VBScript runtime error '800a01f4'
Variable is undefined: 'Session'
/errortest.asp, line 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
如果我设置
@ENABLESESSIONSTATE = false
然后
session("foo") = "bar"
那么结果就是
Microsoft VBScript runtime error '800a0114'
Variable is undefined 'Session'
... file and line no
这通常表示关于程序流程的错误假设,我会跟踪并解决问题。
但是,在一组特定的情况下,我遇到这样一种情况,即在每次页面请求时始终首先调用一段使用会话的代码。它与性能监控有关。
此代码包含一个分叉 - 如果用户有一个会话,我们将采用一种方式,否则我们采用另一种方式。
当然,如果用户会话不存在,因为我们引入了一些在禁用会话的情况下运行的代码,我们就会崩溃。
我可以用
解决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
但我想知道是否有更简单的方法。
为了让这个问题显示一个可接受的答案....
关于使用 isObject() 方法的建议,结果并不好。以下asp...
<%@EnableSessionState=False%>
<% option explicit
response.write "session enabled=" & IsObject(Session)
response.end
%>
结果
Microsoft VBScript runtime error '800a01f4'
Variable is undefined: 'Session'
/errortest.asp, line 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