【问题标题】:Best way to run a long DB query in classic ASP?在经典 ASP 中运行长数据库查询的最佳方式?
【发布时间】:2009-09-15 12:46:34
【问题描述】:

由于数据模型和表中保存的数据量,我有几个查询需要很长时间才能运行的网站。到目前为止,我一直在对数据库手动运行它们以避免任何超时问题等。但是网站所有者已要求在网站上提供这些,以便他可以获得查询结果。

我曾想过通过 .NET Web 服务来执行此操作,并让经典的 ASP 页面异步调用它。该网页将启动该过程,然后将用户重定向到另一个屏幕。然后,Web 服务将运行查询并将结果以 CSV 格式通过电子邮件发送给用户。

但是,我似乎无法让它工作。如果我通过 IE 中的屏幕调用它,该服务运行正常,但通过 ASP 中的 Ajax 调用调用它似乎是一个问题 - 没有生成错误,但也没有创建 CSV 文件。

我在下面附上了经典的 ASP 代码。该服务只有一种方法,其参数名称为电子邮件,其类型为字符串。有人能看出它有什么问题吗?另外,这是最好的方法还是我应该考虑另一种方法?

代码

<%
message = "http://wwww.example.com/service/query.asmx/GetResults?email=test"
set req = server.createobject("MSXML2.XMLHTTP")
With req
    .open "GET", message, False
    .setRequestHeader "Content-Type", "text/xml"
    .send
End With

works = req.responseText
response.redirect "http://www.bbc.co.uk"

%>

【问题讨论】:

    标签: ajax asp-classic


    【解决方案1】:

    异步请求工作并安排稍后交付的想法对我来说似乎很合理。我的 ASP 说得不够好,不知道你的尝试有什么问题,但这真的是你那里的一个 asnch 电话吗? seb 服务是否也会受到 HTTP 连接超时的影响?

    我的方法是让 Ajax 请求将请求放入队列并返回,无需重定向,您仍在用户发出请求的页面上,您的 JavaScript 可以确认该请求寄了,送了。或者,您更传统的“提交页面,存储请求,显示另一个页面”方法可以工作,但存储只是将请求放在队列中。

    队列方法的一个优点是,通过控制守护进程的数量,我们可以在为请求提供服务时获得受控的并行性——避免数据库过载。此外,队列可以持续存在并允许悠闲地传递响应。

    我假设 MS 队列让您有一个守护进程处理请求并传递响应。显然电子邮件有效,但让我觉得有点不友好。使用 Ajax 样式的接口,可以很容易地在不可见的情况下轮询请求的状态并在它们准备好时获取结果,甚至可以使用 Comet 样式的响应推送传递。

    【讨论】:

      【解决方案2】:

      正如 djna 所指出的,这里的问题是您没有调用回调函数。 由于 Ajax 的异步特性,您已经设置了一个回调函数,该函数将在 Ajax 调用结束时执行。

      长话短说:
      从 javascript 函数调用 web 服务,最好使用 JQuery 以避免跨浏览器不兼容

      代码:

      <div id="results">Processing query. Please wait</div>
      
      <script type="text/javascript">
      $(document).ready(function(){
          $("#results").load("http://wwww.mywebsite.com/service/query.asmx/GetResults?email=test&Rnd=" + Math.random().toString()); 
      });
      </script>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多