【问题标题】:Loading bar with classic asp带有经典 asp 的加载栏
【发布时间】:2009-07-17 07:39:25
【问题描述】:

在使用经典 asp 循环创建内容时是否有机会显示加载栏?

我想到了一些 ajax 样式的加载栏,它显示页面仍在创建一些东西。

我尝试使用包含进程状态信息的会话变量来执行此操作,但在此我发现 asp 服务器有一个队列,这意味着您只能同时运行一个 asp 页面。

在加载 asp 页面时,我无法在 sam 服务器上使用相同的会话打开另一个 asp 页面。使用新会话是可能的,但我想使用同一个会话(如果可能的话)。

想法: 可以通过请求asp页面并在页面加载时显示加载栏的ajax请求来完成吗?

有什么办法可以解决状态栏的问题吗?

(抱歉英语不好) 谢谢

编辑:

我这样,但我无法通过 asp 页面访问会话变量。 在第一个 asp 请求完成后,会话阅读器页面只给我一个答案。我认为这是一个会话队列思考。

对我来说是这样的:

ajax页面--(请求进程asp页面)-> process.asp

(相同的ajax页面)--(请求会话阅​​读器页面)-> sessionreader.asp

while sessionstatus != 100 显示进程栏

问题是我在 process.asp 完成后从 sessionreader.asp 得到了答案。这就是为什么我认为这是一个 asp-session-queue-think。

如果给第二个请求一个新的 Session id 可能会起作用(如果这可能的话)?

【问题讨论】:

    标签: asp-classic


    【解决方案1】:

    您可以在发送请求的那一刻在客户端触发 GIF 动画。

    【讨论】:

    • 没错。但大多数进度条都不是实时的。它们大多表示“正在进行中,请耐心等待”。虽然有一些例外,例如基于 Flash 恕我直言的 GMail 中的文件上传。
    【解决方案2】:

    曾经有一个技巧,要么禁用 Response.Buffer(将其设置为 false),要么让它被缓冲,但有时你会执行 Response.Flush 来更新你的进度。

    因此,假设您在页面顶部的某个位置(图像或表格或 div 或任何您想要的)有您的进度条,并且当​​您不时在 asp 脚本中执行某些操作(例如循环)时,将 javascript 刷新回客户端以更新应该已经在屏幕上的进度条。类似:

    <%
      REM Might be a good idea to set the timeout to some large number here...
      Response.Timeout = ...
    %>
    <html>
    :
    <body>
      <p>Please wait...<span id="progress">0</span>% completed.</p>
      : content here...
      <%
      REM Make sure the things above this get sent to the client first
      REM so they will be rendered before the rest of the page is rendered.
      Response.Flush()
    
      For iCnt = 0 To 100
        REM Do some stuffs here...
    
      %>
        <script>$("#progress").html(i)</script>
      <%
        Response.Flush()
      Next
      %>
      : some more contents here...
    </body>
    </html>
    

    我不确定这是否仍然适用于现代浏览器,暂时没有使用它。

    【讨论】:

    • 哎呀!我已经好几年没有看到 REM 声明了。 ;)
    • 哈哈,自从 .NET 以来我就没有进入过 vb / vbscript 世界 :) 即使在 ASP 期间,我也更喜欢在接近尾声时使用 jscript 编写服务器脚本 :)。
    • 我试过了,它对我很有效,我会尝试用 jscript 编写它(我认为这不会是一个问题),然后将它与我的 asp 代码合并。谢谢
    【解决方案3】:

    您将无法仅使用一个 asp 页来执行此操作。您将需要一个向用户显示的页面(进度条所在的位置)。然后,您需要在循环中对读取会话对象的页面进行 ajax 调用(使用 jQuery??)。您将需要一个页面,该页面实际上正在执行您的处理并将其状态写入由 ajax 调用定期监视的会话。您将需要使用 ajax 定期调用以检查会话,直到您获得最终结果。您可以在会话中存储一个数字,例如 1-100,如果它是一个非常长的缓慢过程……但 10、20、……、100 可能效果最好。当您达到 100 时,您将中断循环并且不再轮询会话阅读页面。

    这样做的原因是您需要一个页面来向用户显示您的栏。

    正在处理的页面在完成处理之前无法向用户显示任何内容。

    简单读取会话的页面可以快速处理并快速显示其结果。

    有意义吗?

    【讨论】:

      【解决方案4】:

      问题在于您在 Windows XP 上进行开发并遇到 IIS 5 一次只能处理一个请求的限制。
      因为您怀疑在您尝试监控的原始请求完成之前,进度的 AJAX 请求不会返回。

      据我所知,这个版本的 IIS 无法解决这个问题。它可能是另一个内置限制,阻止您在生产环境中使用 XP IIS 5。即使第二个请求来自具有不同 IP 地址的另一台机器,它也不会在第一个请求完成之前得到处理。

      【讨论】:

      • 谢谢你,我认为你是对的,但我试图在 Firefox 中打开 process.asp 并在 IE 中打开 sessionreader.asp 工作正常。在我绝望中,我将状态写在一个文件中并用 sessionreader.asp 读取它(我知道这是一个可怕的解决方法)它可以工作,但如果想打开两个文件(process.asp 和 sessionreader.asp),我会从 sessionreader 得到答案.asp 当 process.asp 完成时。这就是为什么我认为它的基于会话的队列。
      猜你喜欢
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多