首页 > 编程 > .NET > 正文

ASP.NET中ServerPush用法实例分析

2024-07-10 13:29:07
字体:
来源:转载
供稿:网友

这篇文章主要介绍了ASP.NET中ServerPush用法,实例分析了通过ServerPush实现服务器推送功能,需要的朋友可以参考下

本文实例讲述了ASP.NET中ServerPush用法。分享给大家供大家参考。具体分析如下:

什么是ServerPush,服务器向客户端“推送“,其实就是”长连接“

只有浏览器请求服务器端,服务器端才给浏览器响应数据,不会主动向浏览器推送数据,这是一种安全考虑,也是提高服务器的性能考虑,如果服务器向浏览器主动推送数据,就要用到ServerPush等技术模拟实现。

举个例子:

通过两个页面互相发送消息实现,消息放到数据库。

 

 
  1. /// <summary> 
  2. /// ServerPush1 的摘要说明 
  3. /// </summary> 
  4. public class ServerPush1 : IHttpHandler 
  5. public void ProcessRequest(HttpContext context) 
  6. context.Response.ContentType = "application/json"
  7. string action = context.Request["action"]; 
  8. if (action == "send")//发送 
  9. string me = context.Request["me"]; 
  10. string toUserName = context.Request["toUserName"]; 
  11. string msg = context.Request["msg"]; 
  12. SQLHpler.ExecuteNonQuery("INSERT INTO T_Msgs(FromUserName,ToUserName,Msg) VALUES(@FromUserName,@ToUserName,@Msg)"new SqlParameter("@FromUserName", me), 
  13. new SqlParameter("@ToUserName", toUserName), 
  14. new SqlParameter("@Msg", msg)); 
  15. context.Response.Write(new JavaScriptSerializer().Serialize(new { Status = "ok" })); 
  16. else if (action == "receive"
  17. //登陆,并持续查询、接收对方发过来的数据 
  18. //做一个简单的例子,以ServerPush1.ashx?me=sean 
  19. //请把发给sean的消息发给我一条 
  20. string me = context.Request["me"]; 
  21. while (true
  22. DataTable dt = SQLHpler.ExecuteQuery("SELECT TOP 1 * FROM T_Msgs WHERE ToUserName=@ToUserName",new SqlParameter("@ToUserName", me)); 
  23. if (dt.Rows.Count <= 0) 
  24. Thread.Sleep(500);//没找到,休息500ms再查询,这样避免对数据库的查询压力,和占用WEB服务器CPU资源 
  25. continue;//下一次while 
  26. else 
  27. DataRow row = dt.Rows[0]; 
  28. long id = (long)row["Id"]; 
  29. string fromUserName = (string)row["FromUserName"]; 
  30. string msg = (string)row["Msg"]; 
  31. //查询完之后要删除消息,否则会出现死循环,不停的给页面输出同一个消息 
  32. SQLHpler.ExecuteNonQuery("DELETE FROM T_Msgs WHERE Id=@Id",new SqlParameter("@Id",id)); 
  33. //创建一个匿名对象,将查询到的数据存到里面 
  34. var data = new { FromUserName = fromUserName, Msg = msg, Id = id }; 
  35. string json = new JavaScriptSerializer().Serialize(data);//将匿名对象转换为json 
  36. context.Response.Write(json);//将请求结果以json格式返回 
  37. break
  38. else 
  39. throw new Exception("action错误"); 

 

 
  1. <!DOCTYPE html> 
  2. <html xmlns="http://www.w3.org/1999/xhtml"
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  5. <title></title> 
  6. <script type="text/javascript" src="jquery-1.8.3.min.js"></script> 
  7. <script type="text/javascript"
  8. var rev = function () { 
  9. var mine = $('#me').val(); 
  10. $.ajax({ 
  11. type: 'post', url: 'serverPush1.ashx'
  12. data: { action: 'receive', me: mine },//传给serverPush.ashx根据me查找发给me的消息 
  13. success: function (data) { 
  14. $('#ulMsg').append($('<li>' + data.FromUserName + '对我说:' + data.Msg + '</li>')); 
  15. rev();//收到消息后再向服务器请求数据,再给我一条消息 
  16. }, 
  17. error: function () { 
  18. rev(); 
  19. //哪怕网络请求失败(比如用户网络故障),也再次发送请求 
  20. }); 
  21. }; 
  22. $(function () { 
  23. //发送 
  24. $('#btnSend').click(function () { 
  25. var myName = $('#me').val(); 
  26. var toUserName = $('#toUserName').val(); 
  27. var msg = $('#msgContext').val(); 
  28. $.ajax({ 
  29. type: 'post', url: 'serverPush1.ashx'
  30. data: { action: 'send', me: myName, toUserName: toUserName, msg: msg },//根据用户输入的信息,传到服务端ServerPush.ashx进行插入操作 
  31. success: function (data) { 
  32. if (data.Status == 'ok') {//如果发送成功, 
  33. $('#ulMsg').append($('<li>我对' + toUserName + '说:' + msg + '</li>')); 
  34. $('#msgContext').val(''); 
  35. else { 
  36. alert('发送出错,返回报文无法识别'); 
  37. }, 
  38. error: function () { 
  39. alert('发送出错'); 
  40. }); 
  41. }); 
  42. //登陆,接收数据 
  43. $('#btnLogin').click(function () { 
  44. rev(); 
  45. $(this).attr("disabled""disabled"); 
  46. }); 
  47. /* 
  48. $('#btnLogin').click(function () {//接收 
  49. var mine = $('#me').val(); 
  50. $.ajax({ 
  51. type: 'post', url: 'serverPush1.ashx', 
  52. data: { action: 'receive', me: mine }, 
  53. //传给serverPush.ashx根据me查找发给me的消息 
  54. success: function (data) { 
  55. $('#ulMsg').append($('<li>' + data.toUserName + '对我说:' + data.msg + '</li>')); 
  56. }, 
  57. error: function () { 
  58. alert('接收失败'); 
  59. } 
  60. }); 
  61. });*/ 
  62. }); 
  63. </script> 
  64. </head> 
  65. <body> 
  66. 发送人:<input type="text" id="me" /><input type="button" id="btnLogin" value="登陆" style=""/><br /> 
  67. 接收人:<input type="text" id="toUserName" /><br /> 
  68. 输入消息:<input type="text" id="msgContext" /><input type="button" id="btnSend" value="发送" /><br /> 
  69. 聊天记录:<br /> 
  70. <ul id="ulMsg"
  71. </ul> 
  72. </body> 
  73. </html> 

希望本文所述对大家的asp.net程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表