【问题标题】:ASP Classic Session Variable Not Always Getting SetASP 经典会话变量并不总是被设置
【发布时间】:2010-11-24 03:40:53
【问题描述】:

我正在维护一个经典的 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 登录,并确认我得到了不同的、不可预测的结果。问题是我无法随意复制它,也无法对生产进行故障排除/跟踪。

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

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

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

【问题讨论】:

  • 一种可能性是,由于会话变量作为 cookie 存储在客户端浏览器中,因此根据客户端 cookie 首选项,您的变量不会被存储
  • 他们是??我以为它们会存储在服务器上。这就是我决定使用会话变量而不是显式使用 cookie 的原因。哎呀。我讨厌这种经典的东西。
  • @Mike:你弄错了那根棍子。 Rob 所说的只是 标识 会话的密钥作为 cookie 发送给客户端。会话的实际数据存储在服务器端。
  • 会话变量存储在服务器上,而会话 id 存储在客户端。这样服务器就可以为请求唯一地获取正确的会话对象。如果您在查看您的网站时检查您的 cookie,您会看到一个名为 ASPSESSIONIDxxxxxxx 的 cookie,其中“x”是随机序列。许多平台(asp、asp.net、php 等)都以这种方式处理会话。
  • 肯定存在范围界定问题。我将会话变量的值添加到主登录窗口中的注释中,该注释在客户站点的 iframe 中呈现。那里的值是正确的。然后,当它在新窗口中到达我的网站时,价值就消失了。我想我必须使用查询字符串将它传递到我的域中。

标签: asp-classic


【解决方案1】:

我在使用 VPS 服务器时遇到了同样的问题。您不能在经典 ASP 中使用带有 Session 变量的 Web Garden。

转到 IIS 管理器 - Web 应用程序池并将工作进程的数量更改为 1。

如果您在共享主机中,请请求此配置或更改为只有一名工作人员的应用程序池。

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

问候

www.imaginacolombia.com

【讨论】:

  • 虽然减少工作进程的数量会减少您在该服务器上的连接容量。如果您需要多个工作进程(“网络花园”),则需要 Bytes 文章建议的 DIY 或 3rd 方会话管理。
【解决方案2】:

我看到了几种可能发生这种情况的情况:

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

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

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

【讨论】:

  • cookie 是一个真正的问题,因为很多人都关闭了 cookie,不是吗?如果是这样,那么我要么无法控制这个问题,要么我必须想出另一种方法来保持标志,也许通过隐藏字段(经典中没有 Viewstate,对吗?)。 REFERRER 的想法可能也值得研究。
  • @Mike:持久性 cookie 和易失性 cookie(又名会话 cookie)之间有很大的不同。许多人确实会阻止持久性 cookie,但只会阻止最偏执的会话 cookie。如果这是一个 cookie 阻塞问题,它永远不会起作用,有时它不会起作用。
猜你喜欢
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多