asp.net+iframe实现服务器推送
asp.net实现服务器推送功能,原理就是用隐藏的iframe加载asp.net页面,如aspx或者ashx,然后动态页执行死循环,在循环体中挂起当前执行aspx或者ashx页面的线程执行。aspx或者ashx页面定时输出js脚本更新父页的信息即可。
不过打开长连接后,浏览器进度条会一直处于加载的状态。
关键:serverpush.ashx这个页面一定要禁用缓冲或者调用Flush方法立即输出数据,要不看不到效果或者到缓冲区满后才发送数据到客户端
源代码如下
test.html
<div id="dvContent"></div> <script> function appendContent(data) {//////注册事件提供给iframe输出的js代码调用 var dv = document.createElement('div'); dv.innerHTML = data; document.getElementById('dvContent').appendChild(dv); } </script> <iframe style="display:none" src="serverpush.ashx"></iframe>
serverpush.ashx
<%@ WebHandler Language="C#" Class="ServerPush" %> using System; using System.Web; public class ServerPush : IHttpHandler, System.Web.SessionState.IRequiresSessionState { public void ProcessRequest(HttpContext context) { DateTime t = DateTime.Now; //context.Response.Buffer = false;//禁用缓冲 while (true) { if (DateTime.Now.Subtract(t).TotalSeconds > 60) break;//示例用的,超过60s后结束线程,要长连接注释掉这句 context.Response.Write("<script>parent.appendContent('" + DateTime.Now + "')</script>");//输出js语句调用父页注册的回调函数更新DOM对象的内容 context.Response.Flush();//注意要Flush立刻输出,要不会等到缓冲区满了以后才会输出,或者启用最上面那句禁用缓冲 System.Threading.Thread.CurrentThread.Join(3000);//挂起3s } } public bool IsReusable { get { return false; } } }
加支付宝好友偷能量挖...
原创文章,转载请注明出处:asp.net+iframe实现服务器推送