博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Asp.net的服务器推技术 (Server Push)(采用持久链接+死循环)
阅读量:6162 次
发布时间:2019-06-21

本文共 2199 字,大约阅读时间需要 7 分钟。

在以往的和服务器端通信技术中,我们多数使用的是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# 代码

代码如下:

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" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
<title>Asp.net 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不需要做修改。 

本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/582193,如需转载请自行联系原作者

你可能感兴趣的文章
uva 11401思维+预处理
查看>>
9. Palindrome Number
查看>>
android-远程图片获取和本地缓存
查看>>
PHP Smarty变量调节器
查看>>
shell中的字符串操作
查看>>
Node.js 函数
查看>>
Oracle CheckPoint进程
查看>>
仿知乎注册验证码
查看>>
物联网笔记1
查看>>
代码练习
查看>>
webpack构建Vue项目引入jQ时发生“'$' is defined but never used”的处理
查看>>
2. java变量
查看>>
王爽汇编语言 实验11
查看>>
JS和C#分别防注入代码
查看>>
Django模板语言
查看>>
闪屏,default
查看>>
适合0基础的web开发系列教程-文本格式标签汇总
查看>>
jQuery-对Radio/CheckBox的操作集合
查看>>
webpack的build的时候时间长处理方案
查看>>
通过js 判断当前应用是什么浏览器【借鉴转载】
查看>>