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


     

    分类: ASP.NET 1128人阅读 评论(0) 收藏 举报
    在以往的和服务器端通信技术中,我们多数使用的是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# 代码 
    [csharp] view plaincopy
    1.   public partial class _Default : System.Web.UI.Page   
    2.   
    3. {   
    4.   
    5. protected void Page_Load(object sender, EventArgs e)   
    6.   
    7. {   
    8.   
    9. }   
    10.   
    11. protected override void Render(HtmlTextWriter output)   
    12.   
    13. {   
    14.   
    15. string str;   
    16.   
    17. while (true)   
    18.   
    19. {//死循环保持长链接   
    20.   
    21. str = "<script >window.parent.Change('" + DateTime.Now.ToLongTimeString() + "')</script>";   
    22.   
    23. this.Context.Response.Write(str);   
    24.   
    25. this.Context.Response.Flush();//输脚本调用出   
    26.   
    27. System.Threading.Thread.Sleep(1000);   
    28.   
    29. }   
    30.   
    31. }   
    32.   
    33. }   


      

      WebForm1.aspx 

    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "://.w3./TR/xhtml1/DTD/xhtml1-transitiona l.dtd">   
    2.   
    3. <html xmlns="://.w3./1999/xhtml">   
    4.   
    5. <head runat="server">   
    6.   
    7. <title>Asp. Server Push</title>   
    8.   
    9. <script type="text/javascript">   
    10.   
    11. function Change(str){   
    12.   
    13. window.document.getElementById("div1").innerText=str;   
    14.   
    15. }   
    16.   
    17. function onload(){   
    18.   
    19. var ifrpush = new ActiveXObject("htmlfile"); // 创建对象   
    20.   
    21. ifrpush.open(); //打开   
    22.   
    23. var ifrDiv = ifrpush.createElement("div"); //添加一个DIV   
    24.   
    25. ifrpush.appendChild(ifrDiv); //添加到 htmlfile   
    26.   
    27. ifrpush.parentWindow.Change=Change; //注册 javascript 方法 搞不明白为什么还要注册   
    28.   
    29. ifrDiv.innerHTML = "<iframe src='Default.aspx'></iframe>"; //在div里添加 iframe   
    30.   
    31. ifrpush.close(); //关闭   
    32.   
    33. }   
    34.   
    35. onload();   
    36.   
    37. </script>   
    38.   
    39. </head>   
    40.   
    41. <body>   
    42.   
    43. <div style=" float:left">现在时间是:</div>   
    44.   
    45. <div id="div1"></div>   
    46.   
    47. </body>   
    48.   
    49. </html>   
  • 相关阅读:
    todo--H2数据库
    todo--mybatis-generator-config....
    初次使用git配置以及git如何使用ssh密钥(将ssh密钥添加到github)
    Git 快速入门
    IOS IAP APP内支付 Java服务端代码
    In-App Purchase(iap)快速指南
    Spring MVC @ModelAttribute详解
    Spring MVC @SessionAttributes注解
    Spring MVC 向页面传值-Map、Model和ModelMap
    Spring MVC 向前台页面传值-ModelAndView
  • 原文地址:https://www.cnblogs.com/wahaccp/p/3522287.html
Copyright © 2020-2023  润新知