asp.net 服务器推送(Server Push)

在以往的和服务器端通信技术中,我们多数使用的是AJAX轮询式访问,也就是在Javascript中控制时间间隔,然后每隔一段时间就访问一次服务器,然后获得数据或通知。但是这种轮询方式的访问有90%是在做无用功。 

  要想长时间保持服务器和浏览器之间的连接怎么办?长连接技术,这可不是什么新技术,用IFrame作为隐藏帧指向长请求页面的方法早已被很多人运用在互联网上,但是IFrame作为隐藏帧有一个弊端,那就是浏览器的进度条始终处在读取状态。为了使用户获得更好体验,“Google的天才们”使用了一个叫“htmlfile”的对象解决了这一问题,并把它运用了了GMail和GTalk两个产品上。 

  如今我们公司要做的新项目上要求有实时报警功能,本来我想用AJAX轮询做,但是觉得挺没追求的,前段时间听说有了Server Push,但是没仔细研究,这次倒是个机会,一天时间,从网上搜集资料。资料不是很多,而且现在有很多开发人员还认为长连接是天方夜谭,居然还有把HTTP协议搬出来要证明自己观点的…… 

  废话不多说了,来介绍一下长连接技术,通常的长链接就是做一个网页,里面写好一个IFrame标签,高宽设置为0,SRC属性指向一个网页,比如是ASPX,然后在这个文件中不做别的,只是在调用Context.Response.Write方法,输出什么?比如客户端有一个更改时间的方法Change(time),那输出就是("<script>window.parent.Change("+DateTime.Now.ToStrin g()+")</script>"),也就是不断的输出客户端的函数调用,并且做成死循环,这样浏览器和服务器端就形成了一条源源不断的数据传输链接。 

  那htmlfile是什么呢?这是一个类似Javascript中Window对象的一个ActiveXObject,它内部也是DOM结构,将作为隐藏帧的IFrame写入这个对象中,就可以解决进度条的问题。说的可能比较晦涩,来看实例代码吧: 

  Default.aspx.cs 

  c# 代码 
    public partial class _Default : System.Web.UI.Page 

  { 

  protected void Page_Load(object sender, EventArgs e) 

  { 

  } 

  protected override void Render(HtmlTextWriter output) 

  { 

  string str; 

  while (true) 

  {//死循环保持长链接 

  str = "<script >window.parent.Change('" + DateTime.Now.ToLongTimeString() + "')</script>"; 

  this.Context.Response.Write(str); 

  this.Context.Response.Flush();//输脚本调用出 

  System.Threading.Thread.Sleep(1000); 

  } 

  } 

  } 


  

  WebForm1.aspx 

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "://.w3./TR/xhtml1/DTD/xhtml1-transitiona l.dtd"> 

  <html xmlns="://.w3./1999/xhtml"> 

  <head runat="server"> 

  <title>Asp. Server Push</title> 

  <script type="text/javascript"> 

  function Change(str){ 

  window.document.getElementById("div1").innerText=str; 

  } 

  function onload(){ 

  var ifrpush = new ActiveXObject("htmlfile"); // 创建对象 

  ifrpush.open(); //打开 

  var ifrDiv = ifrpush.createElement("div"); //添加一个DIV 

  ifrpush.appendChild(ifrDiv); //添加到 htmlfile 

  ifrpush.parentWindow.Change=Change; //注册 javascript 方法 搞不明白为什么还要注册 

  ifrDiv.innerHTML = "<iframe src='Default.aspx'></iframe>"; //在div里添加 iframe 

  ifrpush.close(); //关闭 

  } 

  onload(); 

  </script> 

  </head> 

  <body> 

  <div style=" float:left">现在时间是:</div> 

  <div id="div1"></div> 

  </body> 

  </html> 



  Default.aspx不需要做修改。 

来源:http://idc999xwyj.blog.sohu.com/209147902.html


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值