ASP经典会话变量不总是得到设置

问题描述:

我有一个经典的ASP网站我维护,最近我们想要做特殊的渲染动作,如果访客来自一个特定的网站集。因此,在这些游客都来通过去我们的网站的页面,我把一个简单的线设置会话变量: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> 

于是,在所有的页面,每当我需要忍受导航链接,菜单等,我们不想向这些访客展示,我测试会话变量是否为“”,然后进行相应的渲染。

我的问题是,它似乎在开发中对我非常有用,然后我将它发布到Production中,并且它有时很棒,而其他时间它根本不起作用。有时会话变量被设置,有时不会。其他一切都很好。但是,我们的客户在向他们的访问者呈现的页面上看到了不一致的结果,这是一个问题。我试过从不同的PC上登录,我确认我得到了不同的,不可预测的结果。问题是我无法随意复制它,而且我无法排除故障/跟踪生产。

现在我已经解决了这个问题,只需创建具有特殊渲染的重复页面,并确保这些访问者去那里。但这是一种破解,最终难以维持。

Classic ASP中的会话变量有什么特别或不一致的地方吗?有没有更好的方法来解决这个问题? TIA。

更新 我发现当您第一次通过该页面访问该网站时,会话变量未被设置。菜单和一切(应该不会出现在这些情况下)首次显示。然后,如果您返回并刷新登录页面,请再次浏览至同一页面,此时它可以正常工作,然后再次浏览。然后,我去了并删除了所有的缓存,cookies等等,然后再次登录页面,进入我的页面:Bam,菜单(即没有会话变量)。我创建了一个页面,“sessionvars.asp”,其中显示了该var的内容,果然,它是空白的。至少现在我可以随意重现问题了,我应该可以在Dev上复制并追踪它。

+0

一种可能性是,由于会话变量存储在客户端浏览器饼干等等取决于客户cookie偏好设置您的变量不会得到存储 – RobV 2010-04-14 16:02:46

+0

他们是??我以为他们会被存储在服务器上。这就是我决定明确使用会话变量而不是cookie的原因。吉兹。我讨厌这个经典的东西。 – 2010-04-14 19:35:35

+0

@Mike:你的棍棒结局不对。 Rob所说的是,__identifies__会话的密钥作为cookie发送给客户端。会话__is__的实际数据存储在服务器端。 – AnthonyWJones 2010-04-14 21:08:07

我看到一对夫妇场景中,这可能会发生:

第一基本上呼应@ RobV的评论,但要点是ASP会话依赖于存储在浏览器客户端上的cookie。因此,如果用户来自关闭cookie的客户端,则无法为该客户端检索任何会话变量。

另一种情况是某些用户会话可能超时。例如,假设用户转到设置会话变量的页面(并且会话超时时间为10分钟)。然后,他们出去喝杯咖啡,或者陷入一次谈话中。然后,用户在30分钟后点击页面上的链接,到那个时候会话被放弃。你可以尝试增加会话超时时间,看看是否改善了情况。

一种解决方法是 - 而不是会话方法 - 检查客户端的referring url(HTTP_REFERRER),并查看它是否是您认为是“本地报纸”的url。这可以说是更多的工作(并且一些浏览器无论如何都隐藏了引用者),但可能会产生更好的结果。哎呀,你可以尝试两种方法的组合:会话和推荐人。

+0

饼干事情是一个真正的问题,因为许多人关掉cookies,不是吗?如果是这样,那么我无法控制这个问题,或者我必须想出另一种方式来坚持国旗,也许通过隐藏的领域(没有Viewstate的经典,对吧?)。 REFERRER的想法也值得研究。 – 2010-04-14 19:43:48

+0

@Mike:持久性Cookie与易失性Cookie(又称会话cookie)之间有很大区别。许多人阻止持久性cookies,但只有最偏执的块会话cookie。如果这是一个cookie阻塞问题,它永远不会工作,它有时不会工作。 – AnthonyWJones 2010-04-14 21:11:02

我与VPS服务器有同样的问题。在经典的ASP中不能使用带有会话变量的Web Garden。

进入IIS管理器 - 网络Applicattion池和工作进程的数量更改为1

如果你是在一个共享的主机询问此配置或更改应用程序池与ohly一个工人。

更多信息: http://bytes.com/topic/asp-classic/answers/54826-asp-sessions-web-gardens

问候

www.imaginacolombia.com

+0

尽管如此,减少工作进程的数量会降低您在该服务器上的连接容量。如果您需要多个工作进程(“网络花园”),则需要像Bytes文章中所建议的那样进行DIY或第三方会话管理。 – markd 2011-10-07 01:03:42