[转载]用 ASP.NET MVC 实现基于 Multipart XMLHttpRequest 的 Comet – dudu – 博客园.
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+" "); } }; 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); } } }
上面这段代码虽然看起来简单,但当时调试时还是费了一些周折。
代码下载
需要在IIS中以集成模式运行该程序(以VS2010内置Web服务器运行会报错)。访问MultipartXhr.htm,会5秒钟显示一次服务器时间。