參考:http://www.cnblogs.com/vagerent/archive/2010/02/05/1664450.html
PS:為了滿足某些需要實時請求的業務(PS:例如聊天室),我們可以通過多種技術實現, 其中建議大家使用長鏈接(PS:減少帶寬)或者服務器主動推送技術(例如:Signalr)。
這里只對長鏈接進行陳述,參考上面的博客寫了個Demo如下(復制到項目里面可以直接運行):
新建一個 Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="LongPool.Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <input type="button" id="Button1" value="AjaxLongPoll" /> <label id="ajaxMessage"></label> </body> </html> <script src="Scripts/jquery-1.8.2.js"></script> <script> $(function () { $("#Button1").bind("click", { btn: $("#Button1") }, function (evdata) { $.ajax({ type: "POST", url: "Default.aspx", data: { ajax: "1", time: "6000000" }, success: function (data, textStatus) { var _rec = $.parseJSON(data); //成功 if (_rec.success == "1") { //客戶端處理 alert("ok"); ///重新請求 evdata.data.btn.click(); } //超時 if (_rec.success == "0") { evdata.data.btn.click(); } }, complete: function (XMLHttpRequest, textStatus) { if (XMLHttpRequest.readyState == "4") { //alert(XMLHttpRequest.responseText); } }, error: function (XMLHttpRequest, textStatus, errorThrown) { //$("#ajaxMessage").text($(this).text()+" out!") alert(textStatus); evdata.data.btn.click(); } }); }); }) </script> using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace LongPool { public partial class Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Request.Form["ajax"]=="1") { int time = Convert.ToInt32(Request.Form["time"]); DateTime date1 = DateTime.Now.AddMilliseconds(time); bool ready = false; int n = 0; while (Response.IsClientConnected) { Thread.Sleep(3000); if (DateTime.Compare(date1,DateTime.Now)<0) { Response.Write("{\"success\":0}"); Response.End(); break; } //此處進行請求處理,有結果了置ready = true ready = true; if (ready) { Response.Write("{\"success\":1}"); Response.End(); break; } } } else { if (!IsPostBack) { } } } } }