Asp.net的服務(wù)器推技術(shù) (Server Push)
更新時(shí)間:2010年01月22日 21:41:24 作者:
在以往的和服務(wù)器端通信技術(shù)中,我們多數(shù)使用的是AJAX輪詢式訪問,也就是在Javascript中控制時(shí)間間隔,然后每隔一段時(shí)間就訪問一次服務(wù)器,然后獲得數(shù)據(jù)或通知。但是這種輪詢方式的訪問有90%是在做無用功。
要想長時(shí)間保持服務(wù)器和瀏覽器之間的連接怎么辦?長連接技術(shù),這可不是什么新技術(shù),用IFrame作為隱藏幀指向長請求頁面的方法早已被很多人運(yùn)用在互聯(lián)網(wǎng)上,但是IFrame作為隱藏幀有一個(gè)弊端,那就是瀏覽器的進(jìn)度條始終處在讀取狀態(tài)。為了使用戶獲得更好體驗(yàn),“Google的天才們”使用了一個(gè)叫“htmlfile”的對象解決了這一問題,并把它運(yùn)用了了GMail和GTalk兩個(gè)產(chǎn)品上。
如今我們公司要做的新項(xiàng)目上要求有實(shí)時(shí)報(bào)警功能,本來我想用AJAX輪詢做,但是覺得挺沒追求的,前段時(shí)間聽說有了Server Push,但是沒仔細(xì)研究,這次倒是個(gè)機(jī)會,一天時(shí)間,從網(wǎng)上搜集資料。資料不是很多,而且現(xiàn)在有很多開發(fā)人員還認(rèn)為長連接是天方夜譚,居然還有把HTTP協(xié)議搬出來要證明自己觀點(diǎn)的……
廢話不多說了,來介紹一下長連接技術(shù),通常的長鏈接就是做一個(gè)網(wǎng)頁,里面寫好一個(gè)IFrame標(biāo)簽,高寬設(shè)置為0,SRC屬性指向一個(gè)網(wǎng)頁,比如是ASPX,然后在這個(gè)文件中不做別的,只是在調(diào)用Context.Response.Write方法,輸出什么?比如客戶端有一個(gè)更改時(shí)間的方法Change(time),那輸出就是("<script>window.parent.Change("+DateTime.Now.ToString()+")</script>"),也就是不斷的輸出客戶端的函數(shù)調(diào)用,并且做成死循環(huán),這樣瀏覽器和服務(wù)器端就形成了一條源源不斷的數(shù)據(jù)傳輸鏈接。
那htmlfile是什么呢?這是一個(gè)類似Javascript中Window對象的一個(gè)ActiveXObject,它內(nèi)部也是DOM結(jié)構(gòu),將作為隱藏幀的IFrame寫入這個(gè)對象中,就可以解決進(jìn)度條的問題。說的可能比較晦澀,來看實(shí)例代碼吧:
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)
{//死循環(huán)保持長鏈接
str = "<script >window.parent.Change('" + DateTime.Now.ToLongTimeString() + "')</script>";
this.Context.Response.Write(str);
this.Context.Response.Flush();//輸腳本調(diào)用出
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"); // 創(chuàng)建對象
ifrpush.open(); //打開
var ifrDiv = ifrpush.createElement("div"); //添加一個(gè)DIV
ifrpush.appendChild(ifrDiv); //添加到 htmlfile
ifrpush.parentWindow.Change=Change; //注冊 javascript 方法 搞不明白為什么還要注冊
ifrDiv.innerHTML = "<iframe src='Default.aspx'></iframe>"; //在div里添加 iframe
ifrpush.close(); //關(guān)閉
}
onload();
</script>
</head>
<body>
<div style=" float:left">現(xiàn)在時(shí)間是:</div>
<div id="div1"></div>
</body>
</html>
Default.aspx不需要做修改。
serverpush.rar
如今我們公司要做的新項(xiàng)目上要求有實(shí)時(shí)報(bào)警功能,本來我想用AJAX輪詢做,但是覺得挺沒追求的,前段時(shí)間聽說有了Server Push,但是沒仔細(xì)研究,這次倒是個(gè)機(jī)會,一天時(shí)間,從網(wǎng)上搜集資料。資料不是很多,而且現(xiàn)在有很多開發(fā)人員還認(rèn)為長連接是天方夜譚,居然還有把HTTP協(xié)議搬出來要證明自己觀點(diǎn)的……
廢話不多說了,來介紹一下長連接技術(shù),通常的長鏈接就是做一個(gè)網(wǎng)頁,里面寫好一個(gè)IFrame標(biāo)簽,高寬設(shè)置為0,SRC屬性指向一個(gè)網(wǎng)頁,比如是ASPX,然后在這個(gè)文件中不做別的,只是在調(diào)用Context.Response.Write方法,輸出什么?比如客戶端有一個(gè)更改時(shí)間的方法Change(time),那輸出就是("<script>window.parent.Change("+DateTime.Now.ToString()+")</script>"),也就是不斷的輸出客戶端的函數(shù)調(diào)用,并且做成死循環(huán),這樣瀏覽器和服務(wù)器端就形成了一條源源不斷的數(shù)據(jù)傳輸鏈接。
那htmlfile是什么呢?這是一個(gè)類似Javascript中Window對象的一個(gè)ActiveXObject,它內(nèi)部也是DOM結(jié)構(gòu),將作為隱藏幀的IFrame寫入這個(gè)對象中,就可以解決進(jìn)度條的問題。說的可能比較晦澀,來看實(shí)例代碼吧:
Default.aspx.cs
c# 代碼
復(fù)制代碼 代碼如下:
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)
{//死循環(huán)保持長鏈接
str = "<script >window.parent.Change('" + DateTime.Now.ToLongTimeString() + "')</script>";
this.Context.Response.Write(str);
this.Context.Response.Flush();//輸腳本調(diào)用出
System.Threading.Thread.Sleep(1000);
}
}
}
WebForm1.aspx
復(fù)制代碼 代碼如下:
<!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"); // 創(chuàng)建對象
ifrpush.open(); //打開
var ifrDiv = ifrpush.createElement("div"); //添加一個(gè)DIV
ifrpush.appendChild(ifrDiv); //添加到 htmlfile
ifrpush.parentWindow.Change=Change; //注冊 javascript 方法 搞不明白為什么還要注冊
ifrDiv.innerHTML = "<iframe src='Default.aspx'></iframe>"; //在div里添加 iframe
ifrpush.close(); //關(guān)閉
}
onload();
</script>
</head>
<body>
<div style=" float:left">現(xiàn)在時(shí)間是:</div>
<div id="div1"></div>
</body>
</html>
Default.aspx不需要做修改。
serverpush.rar
您可能感興趣的文章:
- 字符批量替換程序asp服務(wù)器版
- asp.net下模態(tài)對話框關(guān)閉之后繼續(xù)執(zhí)行服務(wù)器端代碼的問題
- asp.net“服務(wù)器應(yīng)用程序不可用” 解決方法
- win2003服務(wù)器asp.net權(quán)限設(shè)置問題及解決方法
- ASP 時(shí)間函數(shù)及如何獲取服務(wù)器時(shí)間的寫法
- IIS7.5顯示ASP的詳細(xì)錯(cuò)誤信息"500 – 內(nèi)部服務(wù)器錯(cuò)誤解決"
- win2008 r2 服務(wù)器環(huán)境配置(FTP/ASP/ASP.Net/PHP)
- win2003+IIS服務(wù)器下運(yùn)行ASP+ACCESS非常慢的解決方法
- iis8.5顯示ASP的詳細(xì)錯(cuò)誤信息500 內(nèi)部服務(wù)器錯(cuò)誤解決方法
- 推薦4款傻瓜型的ASP服務(wù)器軟件(asp運(yùn)行環(huán)境一鍵搭建工具)
- Asp.net獲取服務(wù)器指定文件夾目錄文件并提供下載的方法
- asp服務(wù)器如何搭建
- ASP腳本組件實(shí)現(xiàn)服務(wù)器重啟
相關(guān)文章
ASP.NET Core根據(jù)環(huán)境變量支持多個(gè) appsettings.json配置文件
這篇文章主要介紹了ASP.NET Core根據(jù)環(huán)境變量支持多個(gè) appsettings.json配置文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
ASP.NET中DropDownList和ListBox實(shí)現(xiàn)兩級聯(lián)動功能
這篇文章主要介紹了ASP.NET中DropDownList和ListBox實(shí)現(xiàn)兩級聯(lián)動功能的相關(guān)資料,需要的朋友可以參考下2016-01-01
asp.net為網(wǎng)頁動態(tài)添加description描述信息的方法
這篇文章主要介紹了asp.net為網(wǎng)頁動態(tài)添加description描述信息的方法,涉及asp.net動態(tài)操作網(wǎng)頁元素的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
一個(gè)ASP.Net下的WebShell實(shí)例
一個(gè)ASP.Net下的WebShell,主要完成cmd命令。一般的服務(wù)器設(shè)置,asp.net用戶的權(quán)限都比較高。如果asp的webshell無法執(zhí)行,可能asp.net的可以執(zhí)行。2013-07-07
CZGL.ProcessMetrics處理監(jiān)控?cái)?shù)據(jù)的三種方式介紹
這篇文章介紹了CZGL.ProcessMetrics處理監(jiān)控?cái)?shù)據(jù)的三種方式,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
解析ABP框架中的數(shù)據(jù)傳輸對象與應(yīng)用服務(wù)
ABP框架是基于ASP.NET的Web開發(fā)框架,在ABP中應(yīng)用服務(wù)將領(lǐng)域邏輯暴露給展現(xiàn)層,展現(xiàn)層通過傳入數(shù)據(jù)傳輸對象參數(shù)來調(diào)用應(yīng)用服務(wù),而這里我們就來解析ABP框架中的數(shù)據(jù)傳輸對象與應(yīng)用服務(wù)2016-06-06
Visual Studio 2017開發(fā)環(huán)境的安裝圖文教程
Visual Studio 2017是微軟于2017年3月8日正式推出的新版本,是迄今為止 最具生產(chǎn)力 的 Visual Studio 版本。這篇文章主要介紹了Visual Studio 2017開發(fā)環(huán)境的安裝,需要的朋友可以參考下2017-11-11

