Ajax-вызовы jquery и время ответа на ссылки, в то время как удаленный сайт долго не отвечает - PullRequest
0 голосов
/ 11 марта 2009

У меня проблема с асинхронным вызовом с использованием jquery (ajax, load, get, post). Пока я жду ответа удаленного сайта, я не могу переходить по ссылкам, пока удаленный сайт не ответит или не отключится.

Если я нажму ссылку на внешний веб-сайт (например, в Google), страница сразу же переключится. Я пробовал это на моем локальном IIS, Windows 2008 IIS7 и веб-сервере, который поставляется с VS2008.

Чтобы воспроизвести, скопируйте следующий код и измените прокси-страницу на свою собственную и заставьте ее долго ждать (или вы можете попробовать следующий веб-сервис, поскольку для ответа требуется вечность: 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 => - это прокси-пег, который используется для возврата ответа страницы rmote 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

AjaxDelay

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

Ответы [ 2 ]

0 голосов
/ 12 марта 2009

Это прекрасно работает для меня в Firefox 3.1 и IE8. Я заменил URL-адрес страницей ColdFusion, для визуализации которой требуется 15 секунд. Я изменил ссылку "перейти на эту страницу":

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

И фактически создал этот файл (пустой).

0 голосов
/ 12 марта 2009

Хорошо, если Сервер, содержащий Прокси-сервер, расположен на локальной машине, которая также делает запросы AJAX, возможно, что Прокси-сервер что-то делает, чтобы остановить саму обработку компьютера. Вы искали недостатки в коде прокси, которые могут привести к серьезной блокировке?

Когда вы говорите

Windows 2008 IIS7

Это на удаленной машине или это локальная ОС / IIS?

Просто еще один ... Этот вызов веб-службы мне очень быстро возвращается.

Edit:
Я не мог дублировать это с 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...