ASP.NET实现HTTP长轮询(二)——一般处理程序ashx
本文主要描述如何在ASP.NET一般处理程序中实现长轮询:
(1)实现IAsyncResult:
using System; using System.Threading; using System.Web; public class LongPollingAsyncResult : IAsyncResult { public HttpContext Context; public AsyncCallback CallBack; private object _AsyncState; private bool _CompletedSynchronously; private bool _IsCompleted; public LongPollingAsyncResult(HttpContext context, AsyncCallback cb, object extraData) { this.Context = context; this.CallBack = cb; this._AsyncState = extraData; this._CompletedSynchronously = false; this._IsCompleted = false; } public void StartAsyncWork() { int nowTimes = 0;//当前循环次数(或使用Stopwatch计算时间,超时即退出) int maxTimes = 60;//最大循环次数(或使用Stopwatch计算时间,超时即退出) //计时器,每1秒种触发一次Elapsed事件 Timer timer = new Timer(1000); //订阅计时器的Elapsed事件 timer.Elapsed += (sender, e) => { //判断是否已有新数据或超时,若是则停止计时器并执行如下代码 /*this._CompletedSynchronously = false; this._IsCompleted = true; this.CallBack(this);*/ }; //启动计时器 timer.Start(); } // 摘要: // 获取用户定义的对象,它限定或包含关于异步操作的信息。 // // 返回结果: // 用户定义的对象,它限定或包含关于异步操作的信息。 public object AsyncState { get { return _AsyncState; } } // // 摘要: // 获取用于等待异步操作完成的 System.Threading.WaitHandle。 // // 返回结果: // 用于等待异步操作完成的 System.Threading.WaitHandle。 public WaitHandle AsyncWaitHandle { get { return null; } } // // 摘要: // 获取一个值,该值指示异步操作是否同步完成。 // // 返回结果: // 如果异步操作同步完成,则为 true;否则为 false。 public bool CompletedSynchronously { get { return _CompletedSynchronously; } } // // 摘要: // 获取一个值,该值指示异步操作是否已完成。 // // 返回结果: // 如果操作完成则为 true,否则为 false。 public bool IsCompleted { get { return _IsCompleted; } } }
(2)ashx继承IHttpAsyncHandler:
using System; using System.Web; public class LongPolling : IHttpAsyncHandler { public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData) { LongPollingAsyncResult result = new LongPollingAsyncResult(context, cb, extraData); result.StartAsyncWork(); return result; } public void EndProcessRequest(IAsyncResult result) { LongPollingAsyncResult asyncResult = result as LongPollingAsyncResult; //操作asyncResult.Context.Response输出响应 } public void ProcessRequest(HttpContext context) { } public bool IsReusable { get { return false; } } }
(3)使用jQuery发送请求:
(function getData() { $.post('LongPolling.ashx', {}, function(data) { //接收并处理数据 getData(); }); })();