У меня проблема с асинхронным вызовом с использованием 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