ASP.NET中ServerPush用法執行個體分析

來源:互聯網
上載者:User

 本文執行個體講述了ASP.NET中ServerPush用法。分享給大家供大家參考。具體分析如下:

什麼是ServerPush,伺服器向用戶端“推送“,其實就是”長串連“

只有瀏覽器請求伺服器端,伺服器端才給瀏覽器響應資料,不會主動向瀏覽器推送資料,這是一種安全考慮,也是提高伺服器的效能考慮,如果伺服器向瀏覽器主動推送資料,就要用到ServerPush等技術類比實現。

舉個例子:

通過兩個頁面互相發送訊息實現,訊息放到資料庫。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 /// <summary> /// ServerPush1 的摘要說明 /// </summary> public class ServerPush1 : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "application/json"; string action = context.Request["action"]; if (action == "send")//發送 { string me = context.Request["me"]; string toUserName = context.Request["toUserName"]; string msg = context.Request["msg"]; SQLHpler.ExecuteNonQuery("INSERT INTO T_Msgs(FromUserName,ToUserName,Msg) VALUES(@FromUserName,@ToUserName,@Msg)", new SqlParameter("@FromUserName", me), new SqlParameter("@ToUserName", toUserName), new SqlParameter("@Msg", msg)); context.Response.Write(new JavaScriptSerializer().Serialize(new { Status = "ok" })); } else if (action == "receive") //登陸,並持續查詢、接收對方發過來的資料 { //做一個簡單的例子,以ServerPush1.ashx?me=sean //請把發給sean的訊息發給我一條 string me = context.Request["me"]; while (true) { DataTable dt = SQLHpler.ExecuteQuery("SELECT TOP 1 * FROM T_Msgs WHERE ToUserName=@ToUserName",new SqlParameter("@ToUserName", me)); if (dt.Rows.Count <= 0) { Thread.Sleep(500);//沒找到,休息500ms再查詢,這樣避免對資料庫的查詢壓力,和佔用WEB伺服器CPU資源 continue;//下一次while } else { DataRow row = dt.Rows[0]; long id = (long)row["Id"]; string fromUserName = (string)row["FromUserName"]; string msg = (string)row["Msg"]; //查詢完之後要刪除訊息,否則會出現死迴圈,不停的給頁面輸出同一個訊息 SQLHpler.ExecuteNonQuery("DELETE FROM T_Msgs WHERE Id=@Id",new SqlParameter("@Id",id)); //建立一個匿名對象,將查詢到的資料存到裡面 var data = new { FromUserName = fromUserName, Msg = msg, Id = id }; string json = new JavaScriptSerializer().Serialize(data);//將匿名對象轉換為json context.Response.Write(json);//將請求結果以json格式返回 break; } } } else { throw new Exception("action錯誤"); } }
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script type="text/javascript" src="jquery-1.8.3.min.js"></script> <script type="text/javascript"> var rev = function () { var mine = $('#me').val(); $.ajax({ type: 'post', url: 'serverPush1.ashx', data: { action: 'receive', me: mine },//傳給serverPush.ashx根據me尋找發給me的訊息 success: function (data) { $('#ulMsg').append($('<li>' + data.FromUserName + '對我說:' + data.Msg + '</li>')); rev();//收到訊息後再向伺服器請求資料,再給我一條訊息 }, error: function () { rev(); //哪怕網路請求失敗(比如使用者網路故障),也再次發送請求 } }); }; $(function () { //發送 $('#btnSend').click(function () { var myName = $('#me').val(); var toUserName = $('#toUserName').val(); var msg = $('#msgContext').val(); $.ajax({ type: 'post', url: 'serverPush1.ashx', data: { action: 'send', me: myName, toUserName: toUserName, msg: msg },//根據使用者輸入的資訊,傳到服務端ServerPush.ashx進行插入操作 success: function (data) { if (data.Status == 'ok') {//如果發送成功, $('#ulMsg').append($('<li>我對' + toUserName + '說:' + msg + '</li>')); $('#msgContext').val(''); } else { alert('發送出錯,返回報文無法識別'); } }, error: function () { alert('發送出錯'); } }); }); //登陸,接收資料 $('#btnLogin').click(function () { rev(); $(this).attr("disabled", "disabled"); }); /* $('#btnLogin').click(function () {//接收 var mine = $('#me').val(); $.ajax({ type: 'post', url: 'serverPush1.ashx', data: { action: 'receive', me: mine }, //傳給serverPush.ashx根據me尋找發給me的訊息 success: function (data) { $('#ulMsg').append($('<li>' + data.toUserName + '對我說:' + data.msg + '</li>')); }, error: function () { alert('接收失敗'); } }); });*/ }); </script> </head> <body> 發送人:<input type="text" id="me" /><input type="button" id="btnLogin" value="登陸" style=""/><br /> 接收人:<input type="text" id="toUserName" /><br /> 輸入訊息:<input type="text" id="msgContext" /><input type="button" id="btnSend" value="發送" /><br /> 聊天記錄:<br /> <ul id="ulMsg"> </ul> </body> </html>

希望本文所述對大家的asp.net程式設計有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.