一、简介

  在Asp.net MVC实现的Comet推送的原理很简单。

  服务器端:接收到服务器发送的AJAX请求,服务器端并不返回,而是将其Hold住,待到有东西要通知客户端时,才将这个请求返回。

  客户端:请求异步Action,当接收到一个返回时,立即又再发送一个。

  缺点:会长期占用一个Asp.net处理线程。但相比于轮询,其节省了带宽。

  示例:

  新建一个Controller如下:

 
    //Comet服务器推送控制器(需设置NoAsyncTimeout,防止长时间请求挂起超时错误)
[NoAsyncTimeout, SessionState(SessionStateBehavior.ReadOnly)]
public class CometController : AsyncController //需要继承自异步的AsyncController
{
/// <summary>
/// 异步方法,处理客户端发起的请求
/// </summary>
public void IndexAsync()
{
AsyncManager.OutstandingOperations.Increment();
AsyncManager.Parameters["info"] = "怎么了";
AsyncManager.OutstandingOperations.Decrement();
} /// <summary>
/// 当异步线程完成时向客户端发送响应
/// </summary>
/// <param name="token">数据封装对象</param>
/// <returns></returns>
public ActionResult IndexCompleted(string info)
{
return Json(info, JsonRequestBehavior.AllowGet);
}
}
 

  随便找一个页面,通过AJAX请求这一个异步Action:

 
<html>
<head>
<title>AJAX测试</title>
<script src="/Content/jquery-1.10.2.min.js"></script>
<script type="text/javascript">
$(function () {
getCometServerPush();
}) function getCometServerPush() {
$.ajax({
cache: false,
url: '/Comet/Index',
success: function (data) {
$("#info").html(data);
getCometServerPush();
}
});
} </script>
</head>
<body>
<div id="info"></div>
</body>
</html>
 

  上面的示例,如果你在Action上下一个断点,会不停的看到断点在循环。说明异步客户端不停地在推送。当然这个示例仅仅是说明推送的原理。

二、应用

  应用:监控服务器上的一个txt文件,当有变化时,推送内容到客户端。

 
    //Comet服务器推送控制器(需设置NoAsyncTimeout,防止长时间请求挂起超时错误)
[NoAsyncTimeout, SessionState(SessionStateBehavior.ReadOnly)]
public class CometController : AsyncController //需要继承自异步的AsyncController
{
/// <summary>
/// 异步方法,处理客户端发起的请求
/// </summary>
public void IndexAsync()
{
AsyncManager.OutstandingOperations.Increment(); FileSystemWatcher FSW = new FileSystemWatcher();
FSW.Filter = "123.txt"; //仅仅监控123.txt文件
FSW.Path = Server.MapPath(@"/"); //设置监控路径
FSW.EnableRaisingEvents = true; //启动监控
//FileSystemWatcher暂时有个多次触发的问题,但与本推送示例无关,故不解决
FSW.Changed += (object source, FileSystemEventArgs e) =>
{
AsyncManager.Parameters["info"] = System.IO.File.ReadAllText(Server.MapPath(@"/123.txt"),System.Text.Encoding.Default); ;
AsyncManager.OutstandingOperations.Decrement();
};
} /// <summary>
/// 当异步线程完成时向客户端发送响应
/// </summary>
/// <param name="token">数据封装对象</param>
/// <returns></returns>
public ActionResult IndexCompleted(string info)
{
return Json(info, JsonRequestBehavior.AllowGet);
}
}

Asp.net MVC Comet 推送的更多相关文章

  1. Asp.net MVC Comet推送

    一.简介 在Asp.net MVC实现的Comet推送的原理很简单. 服务器端:接收到服务器发送的AJAX请求,服务器端并不返回,而是将其Hold住,待到有东西要通知客户端时,才将这个请求返回. 客户 ...

  2. 【转】Asp.net MVC Comet推送

    原文链接:http://www.cnblogs.com/kissdodog/p/4283485.html 一.简介 在Asp.net MVC实现的Comet推送的原理很简单. 服务器端:接收到服务器发 ...

  3. WinForm中 Asp.Net Signalr消息推送测试实例

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  4. C#—ASP.NET:集成极光推送(Push API v3)

    C#—ASP.NET:集成极光推送(Push API v3) 原文地址: https://blog.csdn.net/CXLLLK/article/details/86489994   1.极光推送官 ...

  5. comet 推送消息到客户端

    weiconfig: <system.web> <httpHandlers> <add path="comet_broadcast.ashx" typ ...

  6. 基于comet服务器推送技术(web实时聊天)

    http://www.cnblogs.com/zengqinglei/archive/2013/03/31/2991189.html Comet 也称反向 Ajax 或服务器端推技术.其思想很简单:将 ...

  7. [译]servlet3.0与non-blocking服务端推送技术

    Non-blocking(NIO)Server Push and Servlet 3 在我的前一篇文章写道如何期待成熟的使用node.js.假定有一个框架,基于该框架,开发者只需要定义协议及相关的ha ...

  8. web推送

    WEB消息推送框架 web-msg-sender是一款web长连接推送框架,采用PHPSocket.IO开发,基于WebSocket长连接通讯,如果浏览器不支持WebSocket则自动转用comet推 ...

  9. workman即时推送

    https://www.workerman.net/web-sender 下载源码解压后运行  start_for_win.bat  如果提示不成功,就把php路径配置到环境变量中去即可 运行后打开浏 ...

随机推荐

  1. RESTful源码学习笔记之RPC和Restful深入理解

    以下资料搜集自网络 0x00 RPC RPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法).通常的实现 ...

  2. SQL学习笔记之SQL查询练习题1

    (网络搜集) 0x00 表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id ...

  3. Hexo搭建 github.io 静态博客使用指南

    What? Hexo 是一个快速.简洁且高效的博客框架.可以使用markdown 解析成文章,在几秒内,即可利用靓丽的主题生成静态网页. Why? 笔记需要整理 How? github 创建 char ...

  4. vim删除某一列

    step1.按键盘上的Esc按键进入vi的命令行模式 step2.点击Ctrl和v按键 step3.按上下左右键选中要删除的内容 step4.按d即可删除选中的列

  5. luogu p3371 单源最短路径(dijkstral

    本来我写的对的 我就多手写了个 ios::sync_with_stdio(false); 我程序里面用了cin 还有scanf 本来想偷偷懒 我就说 我查了半天错 根本找不到的啊... 后来交了几次 ...

  6. Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理

    1. 画画板 示例代码 public class MainActivity extends Activity { private ImageView iv; private Bitmap baseBi ...

  7. 在 R 中使用 Python 字符串函数

    sprintf( )函数很强大,但并非适用于所有应用场景.例如,如果一些部分在模板中多次出现,那么就需要多次写一样的参数.这通常会使得代码冗长而且难以修改:sprintf("%s, %d y ...

  8. Socket编程理论

    Socket理论 本地IP地址.本地端口号.外地IP地址.外地端口号组成一对套接字对. socket(套接字),就是 IP:端口号的形式. 一个完整的Socket有一个本地唯一的Socket号,由操作 ...

  9. ArrayList相关问题

    设定初始化容量new一个list List<String> list = new ArrayList<>(10); list.add("s"); 进入构造方 ...

  10. jstack工具介绍

    一.使用场景 当一个java应用CPU的使用比较高或者到达100%以上的时候,需要分析代码哪里有问题.这时候可以使用jstack命令 二.怎么使用 先使用命令ps –ef |grep keyword ...