ASP.NET中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();
   //哪怕网络请求失败(比如用户网络故障),也再次发送请求
  }
 });
};
$(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程序设计有所帮助。

时间: 2015-06-10

ASP.NET中Global和URLReWrite用法

本文实例讲述了ASP.NET中Global和URLReWrite用法.分享给大家供大家参考.具体如下: Global.asax: 有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用程序安全性以及其它一些任务. 重点了解:application_Start; application_BeginRequest; application_Error; ① application_Start:自从服务器启动起来,网站第一次被访问

Asp.net的服务器推技术 (Server Push)

要想长时间保持服务器和浏览器之间的连接怎么办?长连接技术,这可不是什么新技术,用IFrame作为隐藏帧指向长请求页面的方法早已被很多人运用在互联网上,但是IFrame作为隐藏帧有一个弊端,那就是浏览器的进度条始终处在读取状态.为了使用户获得更好体验,"Google的天才们"使用了一个叫"htmlfile"的对象解决了这一问题,并把它运用了了GMail和GTalk两个产品上. 如今我们公司要做的新项目上要求有实时报警功能,本来我想用AJAX轮询做,但是觉得挺没追求的,

asp.net开发微信公众平台之验证消息的真实性

验证消息的真实性 在MVC Controller所在项目中添加过滤器,在过滤器中重写 public override void OnActionExecuting(ActionExecutingContext filterContext)方法 新建数据模型 注:服务器接收消息时,不再是signature而是msg_signature 微信服务器推送消息到服务器的HTTP请求报文示例 POST /cgi-bin/wxpush? msg_signature=477715d11cdb4164915de

ASP.NET检测到不安全 Request.Form 值解决方案汇总

当我们在网站中使用CKEditor等富文本编辑器时,大多都会遇到这样的到警告 这是因为ASP.NET默认开启对页面提交内容的验证(不仅是ASP.NET MVC,WebForms也默认启用对页面提交的内容进行验证),解决这个问题的关键就在于在有富文本编辑器的页面或者会有提交html代码的页面关闭验证,可大致分为以下三种情况: 基于Framework2.0 webForm的网站 这种情况相比之下算是最好解决的,直接在需要的页面顶部的 Page 指令中设置 ValidateRequest="false

ASP.NET中Application全局对象用法实例浅析

本文实例讲述了ASP.NET中Application全局对象用法.分享给大家供大家参考.具体如下: Application是应用全局对象,被全体共享.无论通过哪个页面操作Application,另一个页面都可以读取Application信息. 由于Application是共享的,操作之前先Lock,操作完成后UnLock. 在一个页面设置数据: Application.Lock(); Application.Set("address", "上海"); Applica

ASP.NET中母版页和shtml实例入门

本文较为深入浅出的分析了ASP.NET中母版页和shtml.分享给大家供大家参考.具体分析如下: 母版页 创建和使用母版页: 1. 创建Webform的母版页(MasterPage) 2. 创建使用母版页的窗体(ContentPage). 3. 母版页使用ContentPlaceHolder挖坑,"使用母版页的窗体"用Content填坑 母版页是服务器帮我们将页面拼接response给浏览器的. 但是,母版页太笨重.推荐使用shtml. shtml ServerSideInclude(

ASP.NET中TimeSpan的用法实例解析

本文实例讲述了ASP.NET中TimeSpan的用法,分享给大家供大家参考.具体如下: ASP.NET 中,两个时间相减,得到一个 TimeSpan 实例,TimeSpan 有一些属性:Days.TotalDays.Hours.TotalHours.Minutes.TotalMinutes.Seconds.TotalSeconds.Ticks,注意没有 TotalTicks. 一.TimeSpan常量.字段 复制代码 代码如下: TimeSpan.MaxValue;            //

ASP.NET中Dictionary基本用法实例分析

本文实例讲述了ASP.NET中Dictionary基本用法.分享给大家供大家参考,具体如下: //Dictionary位于System.Collections.Generic命名空间之下 /* * 使用Dictionary之前必须引用System.Collections.Generic命名空间: * 使用Dictionary时必须声明其键和值的数据类型(可以为任意类型): */ //声明实例化Dictionary为dic System.Collections.Generic.Dictionary

Asp.Net中Cache操作类实例详解

本文以一个Asp.Net的Cache操作类实例代码来详细描述了cache缓存的结构及实现方法,完整代码如下所示: /// <head> /// <function> /// 存储类(存储UserInfo信息) /// </function> /// <description> /// 用Cache存储用户信息 /// 在指定间隔(TimeOut)内取,则可以从Cache中取, /// 如果超出存储时间,则从数据库取用户信息数据 /// 作為所有用户信息的存儲

ASP.NET中图片显示方法实例

本文实例讲述了ASP.NET中图片的显示方法.分享给大家供大家参考.具体如下: genimage.ashx: 复制代码 代码如下: <%@ WebHandler Language="C#" Class="netpix.ImageGenerator" %> genimage.ashx.cs: // Copyright (C) 2003 by Greg Ennis // (mailto:greg@ennis.net) // // The contents o

ASP.NET中Cookie的用法实例分析

本文实例讲述了ASP.NET中Cookie的用法.分享给大家供大家参考.具体分析如下: Cookie的用法也和ASP中差不多.比如我们建立一个名为aspcn,值为飞刀的cookie HttpCookie cookie = new HttpCookie["aspcn"]; cookie.Value = "飞刀"; Response.AppendCookie(cookie); 我们取出Cookie值也很简单 HttpCookie cookie = Request.Coo

asp.net中文件下载功能的实例代码

复制代码 代码如下: //TransmitFile实现下载protected void Button1_Click(object sender, EventArgs e){ Response.ContentType = "application/x-zip-compressed";Response.AddHeader("Content-Disposition", "attachment;filename=z.zip");string filena

在ASP.NET中插入flash代码实例

在需要插入Flash的地方插入以下代码: 复制代码 代码如下: <OBJECT codeBase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"         classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">        <PARAM NAME="_cx

ASP.net中Core自定义View查找位置的实例代码

.NET Core 的内容处处可见,刷爆全球各大社区,所以,老周相信各位大伙伴已经看得不少了,故而,老周不考虑一个个知识点地去写,那样会成为年度最大的屁话,何况官方文档也很详尽.老周主要扯一下大伙伴们在入门的时候可能会疑惑的内容. ASP.NET Core 可以在一个项目中混合使用 Web Pages 和 MVC ,这是老周最希望的,因为这样会变得更灵活.Web Pages 类似于我们过去的 Web 开发方式,以页面为单位,此模型侧重于功能划分.而 MVC 侧重于数据,有什么样的数据模型就有什么

asp.net中MVC借助Iframe实现无刷新上传文件实例

本文实例讲述了asp.net中MVC借助Iframe实现无刷新上传文件的方法.分享给大家供大家参考.具体实现方法如下: html: 复制代码 代码如下: <div id="uploadwindow" style="display: none;">     <form action="/ShopActivitys/ImportActivityItems" id="form1" name="form1&