ASP.NET中ServerPush用法實(shí)例分析
本文實(shí)例講述了ASP.NET中ServerPush用法。分享給大家供大家參考。具體分析如下:
什么是ServerPush,服務(wù)器向客戶端“推送“,其實(shí)就是”長連接“
只有瀏覽器請(qǐng)求服務(wù)器端,服務(wù)器端才給瀏覽器響應(yīng)數(shù)據(jù),不會(huì)主動(dòng)向?yàn)g覽器推送數(shù)據(jù),這是一種安全考慮,也是提高服務(wù)器的性能考慮,如果服務(wù)器向?yàn)g覽器主動(dòng)推送數(shù)據(jù),就要用到ServerPush等技術(shù)模擬實(shí)現(xiàn)。
舉個(gè)例子:
通過兩個(gè)頁面互相發(fā)送消息實(shí)現(xiàn),消息放到數(shù)據(jù)庫。
/// <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")//發(fā)送 { 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") //登陸,并持續(xù)查詢、接收對(duì)方發(fā)過來的數(shù)據(jù) { //做一個(gè)簡單的例子,以ServerPush1.ashx?me=sean //請(qǐng)把發(fā)給sean的消息發(fā)給我一條 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再查詢,這樣避免對(duì)數(shù)據(jù)庫的查詢壓力,和占用WEB服務(wù)器CPU資源 continue;//下一次while } else { DataRow row = dt.Rows[0]; long id = (long)row["Id"]; string fromUserName = (string)row["FromUserName"]; string msg = (string)row["Msg"]; //查詢完之后要?jiǎng)h除消息,否則會(huì)出現(xiàn)死循環(huán),不停的給頁面輸出同一個(gè)消息 SQLHpler.ExecuteNonQuery("DELETE FROM T_Msgs WHERE Id=@Id",new SqlParameter("@Id",id)); //創(chuàng)建一個(gè)匿名對(duì)象,將查詢到的數(shù)據(jù)存到里面 var data = new { FromUserName = fromUserName, Msg = msg, Id = id }; string json = new JavaScriptSerializer().Serialize(data);//將匿名對(duì)象轉(zhuǎn)換為json context.Response.Write(json);//將請(qǐng)求結(jié)果以json格式返回 break; } } } else { throw new Exception("action錯(cuò)誤"); } }
<!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根據(jù)me查找發(fā)給me的消息 success: function (data) { $('#ulMsg').append($('<li>' + data.FromUserName + '對(duì)我說:' + data.Msg + '</li>')); rev();//收到消息后再向服務(wù)器請(qǐng)求數(shù)據(jù),再給我一條消息 }, error: function () { rev(); //哪怕網(wǎng)絡(luò)請(qǐng)求失?。ū热缬脩艟W(wǎng)絡(luò)故障),也再次發(fā)送請(qǐng)求 } }); }; $(function () { //發(fā)送 $('#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 },//根據(jù)用戶輸入的信息,傳到服務(wù)端ServerPush.ashx進(jìn)行插入操作 success: function (data) { if (data.Status == 'ok') {//如果發(fā)送成功, $('#ulMsg').append($('<li>我對(duì)' + toUserName + '說:' + msg + '</li>')); $('#msgContext').val(''); } else { alert('發(fā)送出錯(cuò),返回報(bào)文無法識(shí)別'); } }, error: function () { alert('發(fā)送出錯(cuò)'); } }); }); //登陸,接收數(shù)據(jù) $('#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根據(jù)me查找發(fā)給me的消息 success: function (data) { $('#ulMsg').append($('<li>' + data.toUserName + '對(duì)我說:' + data.msg + '</li>')); }, error: function () { alert('接收失敗'); } }); });*/ }); </script> </head> <body> 發(fā)送人:<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="發(fā)送" /><br /> 聊天記錄:<br /> <ul id="ulMsg"> </ul> </body> </html>
希望本文所述對(duì)大家的asp.net程序設(shè)計(jì)有所幫助。
相關(guān)文章
Linux下以守護(hù)進(jìn)程方式運(yùn)行.NET6
這篇文章介紹了Linux下以守護(hù)進(jìn)程方式運(yùn)行.NET6,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12Entity?Framework代碼優(yōu)先Code?First入門
這篇文章介紹了Entity?Framework的代碼優(yōu)先模式Code?First,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06asp.net實(shí)現(xiàn)Gradview綁定數(shù)據(jù)庫數(shù)據(jù)并導(dǎo)出Excel的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)Gradview綁定數(shù)據(jù)庫數(shù)據(jù)并導(dǎo)出Excel的方法,涉及asp.net操作Gradview實(shí)現(xiàn)數(shù)據(jù)庫綁定及數(shù)據(jù)導(dǎo)出的相關(guān)技巧,非常簡單實(shí)用,需要的朋友可以參考下2015-11-11注冊(cè)表中存儲(chǔ)數(shù)據(jù)庫鏈接字符串的方法
2008-01-01asp.net MVC 在Controller控制器中實(shí)現(xiàn)驗(yàn)證碼輸出功能
這篇文章主要介紹了asp.net MVC 在Controller控制器中實(shí)現(xiàn)驗(yàn)證碼輸出功能,本文給大家介紹非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12asp.net中在用ajax格式傳遞數(shù)據(jù)到aspx頁面時(shí)出現(xiàn)亂碼
asp.net中在用ajax格式傳遞數(shù)據(jù)到aspx頁面時(shí)有時(shí)會(huì)出現(xiàn)亂碼,很是疑惑,不要走開接下來介紹解決方法,感興趣的朋友可以了解下2013-01-01