用 ASP.NET MVC 实现基于 Multipart XMLHttpRequest 的 Comet

Comet是什么?

英文解释:Comet is a web application model in which a long-held HTTP request allows a web server to push data to a browser, without the browser explicitly requesting it. (来自wiki

中文解释:Comet是基于 HTTP 长连接的“服务器推”技术(来自IBM developerWorks)。

Multipart XMLHttpRequest是什么?

英文解释:It is a method for bundling multiple HTTP requests into a single HTTP request and unbundling on the client side through a Javascript handler. (来自TechnoMagicians Blog

中文解决:它允许客户端只用一个HTTP请求就可以从服务端向客户端传送多个资源(来自鼓浪鱼-前端博客)。

为什么要用 ASP.NET MVC 实现?

昨天学习了“反向Ajax,第1部分:Comet介绍”(英文版),但文中的代码服务端代码用的是Java。为了更好的理解这部分知识,实际体验一下,于是用ASP.NET MVC实现了其中一个示例 —— 基于 Multi-part XMLHttpRequest 的 Comet。

这东西有实用价值吗?

说实话,没有实用价值,只为学习之用。因为支持Multipart XMLHttpRequest的浏览器太少,目前只知道FireFox支持,Chrome与IE9都不支持。

代码示例

1. 前端JavaScript代码

var xhr = $.ajaxSettings.xhr();
xhr.multipart = true;
xhr.open('GET', '/comet/multipart', true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
$('#logs').append(xhr.responseText+"<br/>");
}
};
xhr.send(null);

关键代码就是xhr.multipart = true;

2. 服务端ASP.NET MVC 控制器代码

public class CometController : Controller
{
//结束标志,这是随机生成的
static string Boundary = "ABCDEFGHIJKLMNOPQRST";

public ActionResult Multipart()
{
Response.ContentType = "multipart/x-mixed-replace;boundary=\"" + Boundary + "\"";
Response.Headers.Add("Connection", "keep-alive");
Response.Output.Write("--" + Boundary);
Response.Flush();
//每隔5秒种向客户端发送一次数据
while (true)
{
//发送给客户端的数据的MIME类型,如果是JSON,就用application/json
//注意这里一定要用WriteLine()
Response.Output.WriteLine("Content-Type: plain/text");
//这句生成空行的代码不能少
Response.Output.WriteLine();
Response.Output.WriteLine(DateTime.Now.ToString("HH:mm:ss.FFF"));
//发送结束标志,客户端就知道完成了一次发送
Response.Output.WriteLine("--" + Boundary);
Response.Flush();
System.Threading.Thread.Sleep(5000);
}
}
}

上面这段代码虽然看起来简单,但当时调试时还是费了一些周折。

代码下载

CometMvcDemo.rar

需要在IIS中以集成模式运行该程序(以VS2010内置Web服务器运行会报错)。访问MultipartXhr.htm,会5秒钟显示一次服务器时间。

posted @ 2011-10-15 15:15  dudu  阅读(5797)  评论(7编辑  收藏  举报