我有一个我正在维护的经典ASP网站,如果访问者来自一个特定的网站,我们最近想做特殊的渲染操作。因此,在这些访问者必须访问我们网站的页面中,我设置了一个简单的行设置会话变量:
<!-- #include virtual="/clsdbAccess.cs"-->
<%
set db = new dbAccess
%>
<html>
<head>
...
<script language="javascript" type="text/javascript">
...
</script>
</head>
<body>
<%
Session("CAME_FROM_NEWSPAPER") = "your local newspaper"
...
%>
... html stuff ...
</body>
</html>
然后,在以下所有页面中,每当我需要提供我们不想向这些访问者显示的导航链接,菜单等时,我会测试该会话变量是否为“”,然后相应地渲染。
我的问题是它在开发中似乎对我很有用,然后我把它运用到生产中,它有时很好用,有时它根本不起作用。有时会话变量被设置,有时它不会。其他一切都很棒。但是我们的客户看到呈现给访问者的页面上的结果不一致,这是一个问题。我尝试从不同的PC登录,我确认我得到了不同的,不可预测的结果。问题是我无法随意重现它,而且我无法对生产进行故障排除。
现在我通过使用特殊渲染创建重复页面并确保访问者去那里来解决这个问题。但这是一个黑客攻击,最终难以维持。
Classic ASP中的会话变量有什么特殊或不一致的地方吗?有没有更好的方法来解决这个问题? TIA。
更新 我发现第一次通过该页面访问该站点时,会话变量不会被设置。菜单和所有内容(在这些情况下应该不会出现)会在第一时间显示出来。然后,如果您返回并刷新登录页面,请再次浏览到同一页面,这次它可以工作,然后再进行。然后我去删除了所有缓存,cookie等,再次点击登录页面,到达我的页面:Bam,菜单(即没有会话变量)。我创建了一个页面“sessionvars.asp”,在那里我显示了该var的内容,当然,它是空白的。至少现在我可以随意重现问题,我应该能够在Dev上复制它并跟踪它。
答案 0 :(得分:2)
我遇到了与VPS服务器相同的问题。您不能在经典ASP中使用带有Session变量的Web Garden。
转到IIS管理器 - Web应用程序池并将工作进程数更改为1.
如果您在共享主机中请求此配置或更改为与一名工作人员一起使用的应用程序池。
更多信息: http://bytes.com/topic/asp-classic/answers/54826-asp-sessions-web-gardens
此致
答案 1 :(得分:1)
我看到可能发生这种情况的几种情况:
第一个基本上与@ RobV的评论相呼应,但要点是ASP会话依赖于存储在浏览器客户端上的cookie。因此,如果用户来自关闭cookie的客户端,则无法为该客户端检索任何会话变量。
另一种情况是某些用户会话可能会超时。例如,假设用户转到设置会话变量的页面(并且您的会话超时为10分钟)。然后他们出去喝咖啡或者卷入谈话。然后,用户在30分钟后点击您页面上的链接,到那时会话被放弃。您可以尝试增加会话超时,看看是否可以改善这种情况。
一种解决方法是 - 而不是会话方法 - 检查客户端的referring url(HTTP_REFERRER),并查看它是否是您认为是“本地报纸”的网址。这可以说是更多的工作(并且有些浏览器无论如何都隐藏了引用者),但可能会产生更好的结果。哎呀,您可以尝试两种方法的组合:会话和推荐人。