這篇文章主要介紹了ASP.NET中ServerPush用法,實例分析了通過ServerPush實現服務器推送功能,需要的朋友可以參考下
本文實例講述了ASP.NET中ServerPush用法。分享給大家供大家參考。具體分析如下:
什么是ServerPush,服務器向客戶端“推送“,其實就是”長連接“
只有瀏覽器請求服務器端,服務器端才給瀏覽器響應數據,不會主動向瀏覽器推送數據,這是一種安全考慮,也是提高服務器的性能考慮,如果服務器向瀏覽器主動推送數據,就要用到ServerPush等技術模擬實現。
舉個例子:
通過兩個頁面互相發送消息實現,消息放到數據庫。
- /// <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錯誤");
- }
- }
- <!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();
- //哪怕網絡請求失?。ū热缬脩艟W絡故障),也再次發送請求
- }
- });
- };
- $(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程序設計有所幫助。
新聞熱點
疑難解答
圖片精選