傳統 Ajax 由客戶端發起請求;Reverse Ajax (Comet) 讓伺服器主動推送訊息至客戶端。核心技術為 **長連線 (Long Polling)**:客戶端發出請求,伺服器保持連線直到有資料才回應,客戶端收到後立即發出下一個請求。
<%@ Page Language="C#" Async="true" AsyncTimeout="30" EnableSessionState="False" %>
");
Response.Flush();
Response.End(); // 結束長連線
}
public class ChatTask
{
HttpContext _ctx;
public Action OnMessageReceived;
public ChatTask(HttpContext ctx) { _ctx = ctx; }
public IAsyncResult BeginProcess(object sender, EventArgs e, AsyncCallback cb, object state)
{
// 模擬等待新訊息 (實際應用用訊息佇列/資料庫輪詢)
return new ManualAsyncResult(cb, state);
}
public void EndProcess(IAsyncResult ar) { }
public void TimeoutProcess(IAsyncResult ar) { }
}
function startPoll(user) {
$.post("response.aspx", { type: "loop", user: user }, function() {
// 連線結束 (收到訊息或逾時) 立即重新發起
startPoll(user);
});
}
function receiveMsg(user, msg) {
$("#chatBox").append(`${user}: ${msg}`);
}
$(function() { startPoll("User1"); });
EnableSessionState="False" 避免 Session 鎖定導致併發阻塞。applicationPool idleTimeout 較長,或使用 WebSocket (ASP.NET 4.5+ / SignalR) 取代長輪詢。