Asp.net的服務器推技術 (Server Push)(採用持久連接+死循環)

在以往的和服務器端通訊技術中,咱們多數使用的是AJAX輪詢式訪問,也就是在Javascript中控制時間間隔,而後每隔一段時間就訪問一次服務器,而後得到數據或通知。可是這種輪詢方式的訪問有90%是在作無用功。javascript

要想長時間保持服務器和瀏覽器之間的鏈接怎麼辦?長鏈接技術,這可不是什麼新技術,用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# 代碼html

代碼以下:java

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);
}
}
}c#

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>app

Default.aspx不須要作修改。
serverpush.raride

相關文章
相關標籤/搜索