【问题标题】:jquery's Ajax calls and response time on links while remote site's long to answerjquery 的 Ajax 调用和链接响应时间,而远程站点的响应时间很长
【发布时间】:2009-03-11 20:55:22
【问题描述】:

我在使用 jquery(ajax、load、get、post)进行异步调用时遇到问题。当我等待远程站点回答时,我无法浏览我的链接,直到远程网站回答或超时。

如果我点击指向外部网站(例如 google)的链接,页面会立即切换。我在本地 IIS、windows 2008 IIS7 和 VS2008 自带的 web 服务器上都试过了。

要重现复制以下代码并将代理页面更改为您自己的页面并使其等待很长时间(或者您可能想尝试以下 Web 服务,因为它需要很长时间才能回答:http://www.webservicex.net/globalweather.asmx/GetWeather?CityName=Inuvik&CountryName=Canada)。您需要使用代理页面,因为您无法进行远程 ajax 调用)。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Test</title>
        <script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
        <script type="text/javascript">
            $(document).ready(function() {
                //GetRemotePage();
                AjaxRemotePage();
                //LoadRemotePage();
                //PostRemotePage();
            });

            function LoadRemotePage() {
                $("#RemoteDetail").append("Calling delayed page<br />");
                $("#RemoteDetail").load("AjaxProxy.aspx?t/AjaxDelay.aspx?d=10");
            }

            function AjaxRemotePage() {
                $("#RemoteDetail").append("Calling delayed page<br />");
                $.ajax({
                    url: "AjaxProxy.aspx?/AjaxDelay.aspx?d=10",
                    async: true,
                    cache: false,
                    global: false,
                    success: function(html) {
                        $("#RemoteDetail").append("AjaxRemotePage<br />");
                        $("#RemoteDetail").append(html);
                    }
                });
            };

            function PostRemotePage() {
                $("#RemoteDetail").append("Calling delayed page<br />");
                $.post("AjaxProxy.aspx?/AjaxDelay.aspx?d=10", {}, function(xml) {
                    $("#RemoteDetail").append("---In Ajax Call<br />");
                });
            };

            function GetRemotePage() {
                $("#RemoteDetail").append("Calling delayed page<br />");
                $.get("AjaxProxy.aspx?/AjaxDelay.aspx?d=10", {}, function(xml) {
                    $("#RemoteDetail").append("---In Ajax Call<br />");
                });
            }
        </script>

    </head>
    <body>
        <div>
            <a href="http://www.google.com">go google</a><br />
            <a href="/AjaxTest.htm">go this page</a><br />
            <a href="/">go home page</a><br />
        </div>
        <div id="RemoteDetail">
        </div>
    </body>
</html>

AjaxProxy.aspx => 是一个代理页面,用于返回远程页面的响应 AjaxDelay.aspx => 是模拟的远程服务/页面,增加了 10 秒 (d=10) 的延迟来模拟非常慢的远程站点/服务

编辑:添加了 AjaxProxy 内容和 AjaxDelay 内容(两个页面都在 asp.net 2.0 中,aspx 页面中没有任何内容)

AjaxProxy

​​>
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Request.QueryString.Count = 0 Then Response.Write(" ") : Exit Sub

    Dim Url As String = HttpUtility.UrlDecode(Request.QueryString().ToString)
    Dim req As HttpWebRequest = WebRequest.Create(Url)
    Dim res As HttpWebResponse = req.GetResponse
    Dim sreader As StreamReader = New StreamReader(res.GetResponseStream)
    Dim myhtml As String = sreader.ReadToEnd
    sreader.Close()
    res.Close()
    If Url.EndsWith(".xml") Then
        Response.AddHeader("Content-type", "application/xml")
    End If
    Response.Write(myhtml)
End Sub

Ajax延迟

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim Del As Integer = 2
    If String.IsNullOrEmpty(Request("d")) = False Then
        Integer.TryParse(Request("d"), Del)
        If Del = 0 Then Del = 2
    End If

    Del = Del * 1000
    Threading.Thread.Sleep(Del)
    Response.Write(String.Format("Delayed for {0} seconds", Del / 1000))
End Sub

【问题讨论】:

  • 快速问题,请随时编辑您的问题并回复:此错误仅在 IE 中出现还是在所有浏览器中出现?

标签: jquery


【解决方案1】:

这在 Firefox 3.1 和 IE8 中对我来说很好用。我将 URL 替换为需要 15 秒才能呈现的 ColdFusion 页面。我将“转到此页面”链接更改为:

<a href="test2.html">go this page</a><br />

并实际创建了该文件(空)。

【讨论】:

  • 忘了说我使用的是 Firefox 3.06 没错,我试过 IE7、IE6、Chrome,它们都立即改变了页面,但我的 Firefox 却一动不动
  • 刮一下,Ie7 也不动了……开始觉得我的睡眠电话不好
【解决方案2】:

如果包含代理的服务器位于同时发出 ajax 请求的本地计算机上,则代理可能正在做一些事情来停止计算机本身的处理。您是否查找过代理代码中可能导致严重阻塞的缺陷?

当你说

Windows 2008 IIS7

是在远程机器上还是本地 OS/IIS?

只是一个额外的......那个网络服务调用对我来说返回得非常快。

编辑:
我无法用 FF3、Chrome、IE6/7 复制它 我尝试使用以下代码,无论我输入什么作为替代 url。

<script type="text/javascript">
        $(document).ready(function() {
            //GetRemotePage();
            AjaxRemotePage();
            //LoadRemotePage();
            //PostRemotePage();
        });

        function AjaxRemotePage() {
            $("#RemoteDetail").append("Calling delayed page<br />");
            $.ajax({
            url: "PageProxy.ashx?d=10&externalURI=http://www.yahoo.com",
                async: true,
                cache: false,
                global: false,
                success: function(html) {
                    $("#RemoteDetail").append("AjaxRemotePage<br />");
                    $("#RemoteDetail").append(html);
                }
            });
        };
</script>

代理:

using System;
using System.Web;

public class PageProxy : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
            if (context.Request.QueryString["d"] != null)
                System.Threading.Thread.Sleep(10000);

            byte[] externalPage = new System.Net.WebClient().DownloadData(context.Request["externalURI"]);
            context.Response.OutputStream.Write(externalPage, 0, externalPage.Length);
            context.Response.End();
    }

    public bool IsReusable {
        get {
            return false;
        }
    }
}

【讨论】:

  • Win2008 IIS 7 是我的托管服务提供商的服务器(远程) 至于服务,必须是我的位置与您的位置,或者可能只是您测试的几次;)我在回答时进行了测试,YSlow 给出了我以下 2 个响应时间,3 秒和 95 秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多