• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Asp.netMVCComet推送

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  在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 ></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推送的原理很简单。

  服务器端:接收到服务器发送的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 ></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);
        }
    }

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
asp.net简述Web Forms开发模式发布时间:2022-07-10
下一篇:
ASP.NETMVC3快速入门--第二节添加一个控制器(转)发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap