·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> Asp.net的服务器推技术 (Server Push)

Asp.net的服务器推技术 (Server Push)

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

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.ToString()+")</script>"),也就是不断的输出客户端的函数调用,并且做成死循环,这样浏览器和服务器端就形成了一条源源不断的数据传输链接。那htmlfile是什么呢?这是一个类似Javascript中Window对象的一个ActiveXObject,它内部也是DOM结构,将作为隐藏帧的IFrame写入这个对象中,就可以解决进度条的问题。说的可能比较晦涩,来看实例代码吧:Default.aspx.cs

C#代码收藏代码
  1. publicpartialclass_Default:System.Web.UI.Page
  2. {
  3. PRotectedvoidPage_Load(objectsender,EventArgse)
  4. {
  5. }
  6. protectedoverridevoidRender(HtmlTextWriteroutput)
  7. {
  8. stringstr;
  9. while(true)
  10. {//死循环保持长链接
  11. str="<script>window.parent.Change('"+DateTime.Now.ToLongTimeString()+"')</script>";
  12. this.Context.Response.Write(str);
  13. this.Context.Response.Flush();//输脚本调用出
  14. System.Threading.Thread.Sleep(1000);
  15. }
  16. }
  17. }

WebForm1.aspx

Html代码收藏代码
    1. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">>
    2. <htmlxmlns="http://www.w3.org/1999/xhtml">
    3. <headrunat="server">
    4. <title>Asp.netServerPush</title>
    5. <scripttype="text/javascript">
    6. functionChange(str){
    7. window.document.getElementById("div1").innerText=str;
    8. }
    9. functiononload(){
    10. varifrpush=newActiveXObject("htmlfile");//创建对象
    11. ifrpush.open();//打开
    12. varifrDiv=ifrpush.createElement("div");//添加一个DIV
    13. ifrpush.appendChild(ifrDiv);//添加到htmlfile
    14. ifrpush.parentWindow.Change=Change;//注册javascript方法搞不明白为什么还要注册
    15. ifrDiv.innerHTML="<iframesrc='Default.aspx'></iframe>";//在div里添加iframe
    16. ifrpush.close();//关闭
    17. }
    18. onload();
    19. </script>
    20. </head>
    21. <body>
    22. <divstyle="float:left">现在时间是:</div>
    23. <divid="div1"></div>
    24. </body>
    25. </html>