HTTP协议是一个典型的Request/Response协议,是基于TCP/IP之上的一个应用层协议,该协议最典型的特点就是无状态且需要客户端发起Request服务端才能进行Response,这意味着服务端无法主动“推送”信息。但现代很多应用需求这种“服务端推送”,比如说监控系统、报价系统、游戏、协同文档、进度条等应用。因此本文会谈论服务器推送技术的不同手段,以及在Asp.Net中的SignalR是如何封装这些细节来达到推送的目的。

 

实现服务器推送的一些手段

    由于HTTP协议并不支持全双工,因此目前对于服务器“推送”的手段也是根据HTTP协议的特性玩了很多小花招。但大体上可以分为高端大气的全双工类和略微tricky的长轮询类。Streaming类通常会有比较多的限制,比如说对浏览器的版本要求、需要使用sliverlight或flash等查件来实现全双工等。长轮询类主要是包括长轮询或不间断Ajax请求等。

 

Ajax定期请求方式

    这种方式严格来说并不算是服务器推送,而是客户端在一个比较短的间隔内定期去服务器用Ajax请求信息,如果服务器端有了新的事件,则客户端在下一次请求就会获取到,并在客户端调用对应的回调函数来处理这些信息。简单的示意图如图1所示。

图1.Ajax定期请求

 

    当然,这种方式的一些缺点也是显而易见的,首先定期发起请求会白白消耗服务器资源,其次,这种方式也并不是真正的“实时”。

 

长连接的方式

    长连接是另一种方式,是对于页面挂起一个额外的Ajax请求,当服务器有事件发生时,将请求返回给客户端,并在此挂起一个长连接。从而避免了定期请求的损耗,如图2所示。

   

图2.长连接方式

 

    这种方式的缺点同样显而易见,就是需要客户端和服务器对于这部分功能写自定义实现代码。

 

使用插件方式

    使用诸如silverlight和flash等插件可以基于socket做全双工的通信,但这种方式需要特定的客户端,跨平台性并不好(比如手机客户端等不支持一些插件,PC端没有预装Silverlight等)。对条件限制比较严格。

 

Forever iFrame

    这种方式本质上和长连接的方法非常类似,就是在页面中嵌入一个iframe元素,该元素的Src属性指向被请求的对象,服务端有事件发生就,就回传一个调用客户端JS方法的JS。Iframe中HTTP头的Transfer-Encoding属性为chunked,这意味着服务端并不知道要发送给客户端多少数据,也就隐式意味着该连接的长度为无限。

 

HTML5 Web Socket

    WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebSocket通信协议于2011年被IETF定为标准 RFC 6455,WebSocketAPI被W3C定为标准。

    在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

    WebSocket协议的出现可以避免上述几种方式带来的服务器资源占用和宽带占用。但缺点也是很明显的,对客户端和服务端都有一定要求,包括浏览器的版本和服务器的版本(比如IIS7.5+)

 

 

SignalR?

    上面说到了这么多中实现实时应用程序的办法,作为Asp.net框架中,提供了一个叫SignalR的框架来封装这些网络细节,SignalR会自动选择合适的实现技术来实现该种实时程序。我们只要关注更高层面的业务实现,而无需关注技术上的实现细节。

    SignalR最低需要基于Jquery 1.6.4,在服务端至少需要是.Net FrameWork 4.0+。

    使用SignalR会自动根据环境选择合适的网络实现细节,该过程根据微软的官网定义如下:

  1. 如果浏览器是IE8或低于IE8,使用长连接方式。
  2. 如果配置了JSONP参数,则使用长连接方式。
  3. 如果请求跨域,且客户端和服务器端都支持Web Socket,且客户端支持CORS,则使用Web Socket
  4. 如果没跨域,客户端和浏览器都支持的话,使用Web Socket方式
  5. 如果客户端或服务器端不支持Web Socket的话,会使用HTML5的Server-sent events
  6. 如果Server-Sent Event不被支持的话,会使用Forever iFrame
  7. 最后会使用长连接方式

 

    SignalR的实现可以通过在Visual Studio的nuget来获取。SignalR从使用的角度来说模型非常简单,服务端是客户端回调用的HUB方法,而客户端只要引入了对应的JS之后,形成Hub-Proxy,使得服务端被调用后里的方法也可以回调不同的客户端。模型概念如图3所示。

图3.SignalR的Hub模型

 

    在服务端的Hub被调用后,我们可以处理该部分代码,并针对不同的客户端返回信息,一个典型的代码如图4所示。

图4.一些返回给不同客户端的方法

 

    而在客户端,我们仅仅需要引用SignalR的Js文件后,声明了Hub-Proxy,就可以直接调用服务器方法,如图5所示。

图5.客户端直接调用服务端的方法

 

    我们注意到,在使用SignalR的过程中,并没有任何关于网络交互技术细节的实现,仅仅是简单的调用。SignalR已经按照本文之前所提到的那样,根据Context选择的具体的实现细节。

Comet服务器推送与SignalR的更多相关文章

  1. 基于comet服务器推送技术(web实时聊天)

    http://www.cnblogs.com/zengqinglei/archive/2013/03/31/2991189.html Comet 也称反向 Ajax 或服务器端推技术.其思想很简单:将 ...

  2. 实现Comet(服务器推送)的两种方式:长轮询和http流

    Comet 是一种高级的Ajax技术,实现了服务器向页面实时推送数据的技术,应用场景有体育比赛比分和股票报价等. 实现Comet有两种方式:长轮询与http流 长轮询是短轮询的翻版,短轮询的方式是:页 ...

  3. ASP.NET服务器推送及前后台实时交互

    一:项目需求 页面需要做一个上传Excel功能,并处理Excel中的数据到数据库中 这是一个较为漫长的过程 这时我需要在页面上显示处理进度的提示,给用户一个良好的体验 比如给用户提示“正在上传文档”, ...

  4. 浅入浅出“服务器推送”之一:Comet简介

    最近有个项目,其中有项需求要从服务器端主动向客户端推送数据,本以为很简单,但在实际做的过程中发现很棘手,并没有想象中的简单.从网上搜索学习,发现主流讲的还是Ajax的长轮询技术或者流技术,websoc ...

  5. 【DWR系列02】-DWR逆向Ajax即服务器推送

    .literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...

  6. HTML5服务器推送消息的各种解决办法

    摘要 在各种BS架构的应用程序中,往往都希望服务端能够主动地向客户端推送各种消息,以达到类似于邮件.消息.待办事项等通知. 往BS架构本身存在的问题就是,服务器一直采用的是一问一答的机制.这就意味着如 ...

  7. SSE技术详解:一种全新的HTML5服务器推送事件技术

    前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...

  8. Web端服务器推送技术原理分析及dwr框架简单的使用

    1 背景 “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切 ...

  9. 讲解HTML服务器推送相关技术知识(转)

    1. 为什么需要服务器推送? 最大的优点:实时 健康知识平台重庆男科医院 重庆妇科医院适用场景:实时股票价格.商品价格.实时新闻.Twitter/weibo timeline.基于浏览器的聊天系统 2 ...

随机推荐

  1. php面向对象学习

    近期跟着别人开发一套php程序,深感自己面向对象很白痴,于是再次巩固了一下面向对象的学习,自己整理了一下这几天面向对象的东西,给大家分享!! 面向对象的三大特性: 封装 -- 隐藏内部实现,稳定外部接 ...

  2. 使用Maven自动部署Tomcat 6和Tomcat 7下Web应用

    使用Maven自动部署Tomcat 6和Tomcat 7下Web应用 开启Tomcat远程管理权限 在tomcat的config目录下的tomcat-users.xml文件, <role rol ...

  3. C语言atof()函数:将字符串转换为double(双精度浮点数)

    头文件:#include <stdlib.h> 函数 atof() 用于将字符串转换为双精度浮点数(double),其原型为:double atof (const char* str); ...

  4. 工作随笔——Swift中的Range和一些字符操作

    截取字符串在Swift中相比OC要复杂很多,主要原因可能还是OC的NSRange的创建方法中参数类型为int,而Swift却对类型要求很严格,int不能作为参数创建Range,这要使用String中的 ...

  5. Apache Shiro (一)

    参考博客: http://jinnianshilongnian.iteye.com/blog/2018398 1.shiro简介 Apache shiro 是一个JAVA框架,可用于身份难和授权.sh ...

  6. 转:给 C# 开发者的代码审查清单

      给 C# 开发者的代码审查清单   [感谢@L就是L 的热心翻译.如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线.] 这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考. ...

  7. Java jstatd详解

    jstatd 命令全称: Virtual Machine jstat Daemon DESCRIPTION The  jstatd tool is an RMI server application ...

  8. SQL入门经典(七) 之脚本和批处理

    什么是脚本.我们前面学的CREATE TABLE <table name> ,USE <database name>这些都是脚本,为什么用脚本.脚本存储到文件中并且可以重复利用 ...

  9. 需要知道关于struct的一些事情

    前言 重构代码的时候,会遇到长参数的方法,此时就需要使用“引入参数对象”来封装这些参数.大多数时候,这些参数都是简单类型,而且所有参数的值占用的空间也不是非常的大,此时使用对象真的好吗?对象的特性是堆 ...

  10. 完美实现类似QQ的自拍头像、上传头像功能!(Demo 源码)

    现在很多下载客户端程序都需要设定自己头像的功能,而设定头像一般有两种方式:使用摄像头自拍头像,或者选择一个图片的某部分区域作为自己的头像. 一.相关技术 若要实现上述的自拍头像和上传头像的功能,会碰到 ...