ASP.NET MVC 实现基于 XMLHttpRequest long polling 的 Comet

我个人的理解是,看起来就像在Web环境中客户端能订阅服务端的事件,服务器端通过事件去通知客户端。如果服务器端用 ASP.NET 来实现,可以利用 .NET 的事件驱动机制,很有意思,下面的示例代码将展示这一点。

先看Web前端js代码:

 代码如下 复制代码

jQuery(function ($) {
    function long_polling() {
        $.getJSON('/comet/LongPolling', function (data) {
            if (data.d) {
                $('#logs').append(data.d + "<br/>");
            }
            long_polling();
        });
    }
    long_polling();
});

js代码很简单,就是一个递归调用(调用在callback时进行的),通过jQuery的$.getJSON发起Ajax请求,'/comet/LongPolling' 表示请求的服务端 CometController 的 LongPolling Action 的网址。这里我们可以看出实现 Comet 的难点不在 Web 前端,而是在服务器端。

接下来重点看 Web 服务器 ASP.NET MVC Controller 的代码。

首先要注意的是为了响应 XMLHttpRequest long polling 请求,我们需要实现一个异步控制器(AsyncController),如果您对 AsyncController 不熟悉,建议阅读MSDN上的文章 Using an Asynchronous Controller in ASP.NET MVC 。

先上 Controller 的实现代码:

(注:该控制器实现的功能是每隔5秒钟向客户端发送服务器当时间)

 代码如下 复制代码

public class CometController : AsyncController
{
    //LongPolling Action 1 - 处理客户端发起的请求
    public void LongPollingAsync()
    {
        //计时器,5秒种触发一次Elapsed事件
        System.Timers.Timer timer = new System.Timers.Timer(5000);
        //告诉ASP.NET接下来将进行一个异步操作
        AsyncManager.OutstandingOperations.Increment();
        //订阅计时器的Elapsed事件
        timer.Elapsed += (sender, e) =>
            {
                //保存将要传递给LongPollingCompleted的参数
                AsyncManager.Parameters["now"] = e.SignalTime;
                //告诉ASP.NET异步操作已完成,进行LongPollingCompleted方法的调用
                AsyncManager.OutstandingOperations.Decrement();
            };
        //启动计时器
        timer.Start();
    }

    //LongPolling Action 2 - 异步处理完成,向客户端发送响应
    public ActionResult LongPollingCompleted(DateTime now)
    {
        return Json(new { d = now.ToString("MM-dd HH:mm:ss ") +
            "-- Welcome to cnblogs.com!" },
            JsonRequestBehavior.AllowGet);
    }
}  

实现异步控制器需要继承 System.Web.Mvc.AsyncController,并将 Action 分解为两个,比如 Action 叫 LongPolling,则分解为 LongPollingAsync 与 LongPollingCompleted 。LongPollingAsync 接受客户端请求,并发起异步操作;异步操作完成,调用LongPollingCompleted。

AsyncManager.OutstandingOperations.Increment(); 告诉ASP.NET接下来将进行一个异步操作。

AsyncManager.OutstandingOperations.Decrement(); 告诉ASP.NET异步操作完成,请调用LongPollingCompleted()方法。

示例代码中的异步操作就是将服务器当前时间作为参数传递给 LongPollingCompleted() 方法,LongPollingCompleted() 获取服务器当前时间并传递给客户端,客户端收到后将之显示出来,将继续发起 Ajax 请求 ... 这样周而复始,实现了基于 XMLHttpRequest long polling 的 Comet。

时间: 2024-10-30 09:51:30

ASP.NET MVC 实现基于 XMLHttpRequest long polling 的 Comet的相关文章

ASP.NET MVC下基于异常处理的完整解决方案

EntLib的异常处理应用块(Exception Handling Application Block)是一个不错的异常处理框架,它使我们可以采用配置的方式来定义异常处理策略.而ASP.NET MVC是一个极具可扩展开发框架,在这篇文章中我将通过它的扩展实现与EntLib的集成,并提供一个完整的解决异常处理解决方案.[源代码从这里下载] 目录 一.基本异常处理策略 二.通过自定义Action处理异常 三.通过配置的Error View处理异常 四.自定义ActionInvoker:Excepti

Asp.Net MVC:基于cookie的用户自选视图引擎实现

在我以前的文章中详细介绍了目前mvc框架中的视图引擎管理,这个视图引擎可以方便的实现系统多视图引擎的管理,让系统可以轻松更好视图引擎,但是,在一些应用,比如bbs,多用户blog中,往往需要提供用户自选skin的功能,比如bbs中某个用户通过菜单可以随意更换自己的skin设置,而mvc框架的默认视图管理器对这个要求就无法做到了,而本文则是使用viewengine规则来实现一个用户自选视图引擎的功能. 在本系统中,用户选择的skin信息将保存在cookie中,这意味着可以让用户控制这个选择保存的时

ASP.NET MVC专题

Asp.net Mvc Framework 十二 Castle扩展 Asp.net Mvc Framework 十一 (自定义Helper在MVC中的使用) Asp.net Mvc Framework 十(测试方法及Filter的示例) Asp.net Mvc Framework 九 (View与Controller交互) Asp.net Mvc Framework 八 (Helper) Asp.net Mvc Framework 七 (Filter及其执行顺序) Asp.net Mvc Fra

《精通 ASP.NET MVC 4》----1.3 ASP.NET MVC的关键优点

1.3 ASP.NET MVC的关键优点 精通 ASP.NET MVC 4 ASP.NET已经获得了巨大的商业成功,但正如所讨论的,其他Web开发领域也在进步,即使是微软也在不断清理Web Form的垢病,因为其基本设计看上去已经相当陈旧了. 2007年10月,在德克萨斯-奥斯汀举行的第一次ALT.NET国际会议上,微软副总裁ScottGuthrie宣布并演示了崭新的MVC Web开发平台,它建立在核心ASP.NET平台之上,明确地作出对Rails等技术进展的直接回应,以及对Web Form批评

《精通 ASP.NET MVC 5》----1.3 ASP.NET MVC的关键优点

1.3 ASP.NET MVC的关键优点 2007年10月,微软公司发布了一款新的MVC Web开发平台.它建立在核心ASP.NET平台之上,明确地形成了对Rails这类技术进展的直接响应,并作为对Web Form批评的一种反应.下面几小节将描述这一新平台如何克服Web Form的局限性,并将ASP.NET重新带回到先进行列. 1.3.1 MVC的体系结构 重要的是区别MVC体系结构模式与ASP.NET MVC框架.MVC模式并不新--这要回溯到1978年Xerox PARC的Smalltalk

《精通 ASP.NET MVC 3 框架(第三版)》---- 1.3 ASP.NET MVC的主要优势

1.3 ASP.NET MVC的主要优势 精通 ASP.NET MVC 3 框架(第三版)ASP.NET已经获得了巨大的商业成功,但正如所讨论的,其他Web开发领域也在进步,即使是微软也在不断清理Web Form的垢病,因为其基本设计看上去已经相当陈旧了. 2007年10月,在得克萨斯-奥斯汀举行的第一次ALT.NET国际会议上,微软副总裁Scott.Guthrie宣布并演示了崭新的MVC Web开发平台分支,它建立在核心的ASP.NET平台之上,明确地作出对Rails等技术的进展的直接回应,以

“.NET研究”专访微软MVP衣明志:走进ASP.NET MVC 2框架开发

日前微软已经发布ASP.NET MVC 2框架RC版,究竟这次RC版本的发布对于WEB开发者带来怎样的改变?以及未来ASP.NET MVC 2正式版还会有哪些改进?带着这样的问题,我们51CTO记者彭凡专门采访了微软MVP衣明志老师.ASP.NET MVC是微软官方提供的MVC模式编写ASP.NET WEB应用程序的一个框架. MVP专访人物介绍 衣明志,蝉联五届微软MVP,烟台.NET俱乐部主席,现主要从事.NET平台下的Web应用开发.解决方案.构架设计及技术培训等工作.   照片居中者为衣

专访微软MVP衣明志:走进ASP.NET MVC 2框架开发

日前微软已经发布ASP.NET MVC 2框架RC版,究竟这次RC版本的发布对于WEB开发者带来怎样的改变?以及未来ASP.NET MVC 2正式版还会有哪些改进?带着这样的问题,我们51CTO记者彭凡专门采访了微软MVP衣明志老师.ASP.NET MVC是微软官方提供的MVC模式编写ASP.NET WEB应用程序的一个框架. MVP专访人物介绍 衣明志,蝉联五届微软MVP,烟台.NET俱乐部主席,现主要从事.NET平台下的Web应用开发.解决方案.构架设计及技术培训等工作. 照片居中者为衣明志

ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象,在不同的使用场景中可能具有不同的验证规则.举个简单的例子,对于一个表示应聘者的数据对象来说,针对应聘的岗位不同,肯定对应聘者的年龄.性别.专业技能等方面有不同的要求.但是ASP.NET MVC的Model验证确是Model驱动的,因为验证规则以验证特性的形式应用到Model类型及其属性上.这样的验证方式实际上限制了Model类型在基于不同验证规则的使用场景中的重用.通过上一篇文章<将V