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实现服务器推送

评论(0)Web开发网
阅读(350)喜欢(0)Asp.Net/C#/WCF