ASP.NET MVC 通过异步控制器实现 Comet 长连接

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.SessionState;
namespace Vitou.CRM.Web.Controllers
{
    //Comet服务器推送控制器(需设置NoAsyncTimeout,防止长时间请求挂起超时错误)
    [NoAsyncTimeout, SessionState(SessionStateBehavior.ReadOnly)]
    public class CometController : AsyncController   //需要继承自异步的AsyncController
    {
        /// <summary>
        /// 异步方法,处理客户端发起的请求
        /// </summary>
        public void IndexAsync()
        {
            AsyncManager.OutstandingOperations.Increment();
            //保存将要传递给LongPollingCompleted的参数
            AsyncManager.Parameters["info"] = "怎么了";
            System.Threading.Thread.Sleep(10000);
            //告诉ASP.NET异步操作已完成,进行LongPollingCompleted方法的调用
            AsyncManager.OutstandingOperations.Decrement();
        }
        /// <summary>
        /// 当异步线程完成时向客户端发送响应
        /// </summary>
        /// <param name="token">数据封装对象</param>
        /// <returns></returns>
        public ActionResult IndexCompleted(string info)
        {
            return Json(info, JsonRequestBehavior.AllowGet);
        }
    }
    ////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);
    //    }
    //}
}

@{
    ViewBag.Title = "Chat";
    Layout = "~/Views/Shared/_WindowLayout.cshtml";
}
@section scripts{
    <script type="text/javascript">
    $(function () {
        getCometServerPush();
    })
    function getCometServerPush() {
        $.ajax({
            cache: false,
            url: '/Comet/Index',
            success: function (data) {
                $("#info").append(data+"<hr />");
                getCometServerPush();
            }
        });
    }
</script>
}
<div id="info"></div>


知识共享许可协议
《ASP.NET MVC 通过异步控制器实现 Comet 长连接》常伟华 创作。
采用 知识共享 署名-相同方式共享 3.0 中国大陆 许可协议进行许可。
  • 多说评论
  • 签名
  • 新浪微博
  • 默认评论
  • Tab Header 5

0 条评论 / 点击此处发表评论

Tab Content 5

开发技术


开发平台和工具

sitemap     164.91ms