asp.net 服务器推送(Server Push) 支持 IE、火狐、谷歌等 仅供参考

asp.net 服务器推送(Server Push) 这个示例只支持IE的推送,但在现在浏览器多元化的时代,
只支持IE在大多数时候还是不够的,如何兼容多种浏览器是摆在我们程序员面前的一大难题,
算了,不诉苦了,回归正题,在非IE浏览器下,我们在借助 HttpRequest 对象来实现推送,
判断 request.readyState == 3 就可以了。


废话就不说了,示例代码如下:
(已上传示例程序:服务器推送示例-支持IE火狐谷歌等)本页代码已更新,上传的示例程序也已更新。
经测试,本代码在IE6/8、火狐、傲游极速模式下,可以长时间推送数据,已测时间大于3小时。
已解决在IE下,推送时间短于1分钟的问题。其罪魁祸首就是原来网上的代码将htmlfile定义在了onload方法内了,将htmlfile定义为全局变量就可以解决问题了,真郁闷啊,花一天时间找到这个BUG,隐藏太深了。。。

注意,在同一时间同一浏览器,用推送技术不能超过一个,如果同时保持两个长链接,那IE下其它请求均会被阻塞。

 

在实际项目应用中,服务器端使用的是Oracle的变化通知功能,但并不能保证每一个客户端都会通知到,本文仅供参考。 --2013.4.8



Default.aspx.cs

[csharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.UI;  
  6. using System.Web.UI.WebControls;  
  7.   
  8. public partial class _Default : System.Web.UI.Page  
  9. {  
  10.     protected void Page_Load(object sender, EventArgs e)  
  11.     {  
  12.   
  13.     }  
  14.   
  15.     protected override void Render(HtmlTextWriter output)  
  16.     {  
  17.         //long index = 0;  
  18.         string str;  
  19.         while (this.Context.Response.IsClientConnected)  
  20.         {  
  21.             //死循环保持长链接   
  22.             str = "<script>window.top.Change('" + DateTime.Now.ToLongTimeString() + "');</script>";  
  23.             this.Context.Response.Write(str);  
  24.             this.Context.Response.Flush();//输脚本调用出  
  25.             System.Threading.Thread.Sleep(1000);  
  26.               
  27.             //测试意外关闭  
  28.             //index++;  
  29.             //if (index > 10)  
  30.             //    break;   
  31.         }  
  32.         base.Render(output);  
  33.     }  
  34. }  

PushTest.aspx
[html]  view plain  copy
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="PushTest.aspx.cs" Inherits="PushTest" %>  
  2.   
  3.   
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  5. <html xmlns="http://www.w3.org/1999/xhtml">  
  6. <head runat="server">  
  7.     <title>Asp.Net Server Push</title>  
  8.   
  9.   
  10.     <script type="text/javascript">  
  11.         function Change(str) {  
  12.             document.getElementById("div1").innerHTML = str;  
  13.         }  
  14.         var ifrpush = null;  //将变量定义在onload方法之外可以长时间保持长链接  
  15.         var request = null;    
  16.         var responseDIV = document.createElement("div");  
  17.         responseDIV.style.display = "none";  
  18.         if (navigator.userAgent.indexOf("Firefox") > -1)  
  19.             document.body.appendChild(responseDIV);  
  20.         //非IE长链数据处理或重新打开  
  21.         function NOTIEReadyStateChange() {  
  22.             if (request.readyState == 3) {  
  23.                 //长链接数据处理  
  24.                 var restr = request.responseText.replace(responseDIV.innerHTML, "");  
  25.                 restr = restr.replace(/<script>/g, "").replace(/<\/script>/g, "");  
  26.                 window.eval(restr);  
  27.                 responseDIV.innerHTML = request.responseText;  
  28.             } else if (request.readyState == 4) {  
  29.                 //长链接中断导致加载完成  
  30.                 request = new window.XMLHttpRequest();  
  31.                 responseDIV.innerHTML = "";  
  32.                 var url = "default.aspx";  
  33.                 request.open("GET", url, true);  
  34.                 request.onreadystatechange = NOTIEReadyStateChange;  
  35.                 request.send(null);  
  36.             }  
  37.         }  
  38.         //IE长链接是否已断开  
  39.         function IsLoaded() {  
  40.             if (ifrpush != null && ifrpush.readyState == 'complete') {  
  41.                 alert("refresh");  
  42.                 //长链接意外断开导致加载完成处理  
  43.                 ifrpush = null;  
  44.                 ifrpush = new ActiveXObject("htmlfile"); // 创建对象  
  45.                 ifrpush.open(); //打开   
  46.                 var ifrDiv = ifrpush.createElement("div"); //添加一个DIV  
  47.                 ifrpush.appendChild(ifrDiv); //添加到 htmlfile  
  48.                 ifrpush.parentWindow.Change = Change;  
  49.                 ifrDiv.innerHTML = "<iframe src='Default.aspx'></iframe>"; //在div里添加 iframe  
  50.                 ifrpush.close(); //关闭  
  51.             }  
  52.         }  
  53.         function onload() {  
  54.             var isIE = !!window.ActiveXObject;  
  55.             if (isIE) {  
  56.                 ifrpush = new ActiveXObject("htmlfile"); // 创建对象  
  57.                 ifrpush.open(); //打开   
  58.                 var ifrDiv = ifrpush.createElement("div"); //添加一个DIV   
  59.                 ifrpush.appendChild(ifrDiv); //添加到 htmlfile   
  60.                 ifrpush.parentWindow.Change = Change; //注册 javascript 方法  
  61.                 ifrDiv.innerHTML = "<iframe src='Default.aspx'></iframe>"; //在div里添加 iframe  
  62.                 ifrpush.close(); //关闭  
  63.                 setInterval("IsLoaded()", 1000); //监视长链接状态  
  64.             } else {  
  65.                 request = new window.XMLHttpRequest();  
  66.                 responseDIV.innerHTML = "";  
  67.                 var url = "default.aspx";  
  68.                 request.open("GET", url, true);  
  69.                 request.onreadystatechange = NOTIEReadyStateChange;  
  70.                 request.send(null);  
  71.             }  
  72.         }  
  73.         onload();   
  74.     </script>  
  75. </head>  
  76. <body>  
  77.     <form id="form1" runat="server">  
  78.     <div>  
  79.         <div style="float: left">  
  80.             现在时间是:</div>  
  81.         <div id="div1">  
  82.         </div>  
  83.     </div>  
  84.     </form>  
  85. </body>  
  86. </html>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值