Asp.net MVC Comet 推送

一、简介

  在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);
        }
    }
时间: 2024-11-07 13:30:55

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

Asp.net MVC Comet推送

一.简介 在Asp.net MVC实现的Comet推送的原理很简单. 服务器端:接收到服务器发送的AJAX请求,服务器端并不返回,而是将其Hold住,待到有东西要通知客户端时,才将这个请求返回. 客户端:请求异步Action,当接收到一个返回时,立即又再发送一个. 缺点:会长期占用一个Asp.net处理线程.但相比于轮询,其节省了带宽. 示例: 新建一个Controller如下: //Comet服务器推送控制器(需设置NoAsyncTimeout,防止长时间请求挂起超时错误) [NoAsyncT

【转】Asp.net MVC Comet推送

原文链接:http://www.cnblogs.com/kissdodog/p/4283485.html 一.简介 在Asp.net MVC实现的Comet推送的原理很简单. 服务器端:接收到服务器发送的AJAX请求,服务器端并不返回,而是将其Hold住,待到有东西要通知客户端时,才将这个请求返回. 客户端:请求异步Action,当接收到一个返回时,立即又再发送一个. 缺点:会长期占用一个Asp.net处理线程.但相比于轮询,其节省了带宽. 示例: 新建一个Controller如下: //Com

Servlet 3.0笔记之异步请求Comet推送iFrame示范

Servlet3规范提出异步请求,绝对是一巨大历史进步.之前各自应用服务器厂商纷纷推出自己的异步请求实现(或者称comet,或者服务器推送支持,或者长连接),诸如Tomcat6中的NIO连接协议支持,Jetty的continuations编程架构,SUN.IBM.BEA等自不用说,商业版的服务器对Comet的支持,自然走在开源应用服务器前面,各自为王,没有一个统一的编程模型,怎一个乱字了得.相关的comet框架也不少,诸如pushlet.DWR.cometd;最近很热HTML5也不甘寂寞,推出W

comet 推送消息到客户端

weiconfig: 1 <system.web> 2 <httpHandlers> 3 <add path="comet_broadcast.ashx" type="AsnyHandler" verb="POST,GET"/> 4 </httpHandlers> 5 <compilation debug="true" targetFramework="4.0&q

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

http://www.cnblogs.com/zengqinglei/archive/2013/03/31/2991189.html Comet 也称反向 Ajax 或服务器端推技术.其思想很简单:将数据直接从服务器推到浏览器,而不必等到浏览器请求数据. 主要思想:服务器端将数据推送到客户端(浏览器) 本人做了简单的web实时聊天系统:服务器推送(聊天).zip 系统简单说明如下: { 系统所用数据库:sqlite数据库 UserInfo:用户信息表 UserRelation:用户关系表 Mes

web推送

WEB消息推送框架 web-msg-sender是一款web长连接推送框架,采用PHPSocket.IO开发,基于WebSocket长连接通讯,如果浏览器不支持WebSocket则自动转用comet推送. 通过后台推送消息,消息可以即时推送到客户端,非轮询,实时性非常好,性能很高. 特点: 多浏览器支持 支持针对单个用户推送消息 支持向所有用户推送消息 长连接推送(websocket或者comet),消息即时到达 支持在线用户数实时统计展示 支持在线页面数实时统计展示 支持跨域推送 下载 WEB

Asp.NET MVC 中使用 SignalR 实现推送功能

一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息. 可访问其官方网站:https://github.com/SignalR/ 获取更多资讯. 二.Asp.net SignalR 是个什么东东 Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(lo

在 Asp.NET MVC 中使用 SignalR 实现推送功能 [转]

在 Asp.NET MVC 中使用 SignalR 实现推送功能 罗朝辉 ( http://blog.csdn.net/kesalin ) CC许可,转载请注明出处 一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息. 可访问其官方网站:https://github.com/SignalR/ 获取更多资讯. 二,实现机制

在 Asp.NET MVC 中使用 SignalR 实现推送功能

一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息. 二,实现机制 SignalR 的实现机制与 .NET WCF 或 Remoting 是相似的,都是使用远程代理来实现.在具体使用上,有两种不同目的的接口:PersistentConnection 和 Hubs,其中 PersistentConnection 是实现了长