Asp.net 的 伺服器推技術 (Server Push)

來源:互聯網
上載者:User

在以往的和伺服器端通訊技術中,我們多數使用的是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不需要做修改。

 

 下載 serverpush.rar

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.