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();
});
})();