SignalR
一、简介
为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程。实时 Web 功能是指这样一种功能(聊天室,股票交易,微信角标,站内消息):当所连接的客户端变得可用时服务器代码可以立即向其推送内容,而不是让服务器等待客户端请求新的数据。使用websocket通信,底层是socket (本质是编程接口(API),对TCP/IP的封装,提供了网络通信的能力)。
当环境条件合适时,SignalR将WebSocket作为底层传输方式的优先实现,当然,它也能很高效地回退到其他技术(长轮询, ServerSendEvent)。同时,SignalR提供了非常良好的Api以供远程调用(RPC) 浏览器中的js代码。
SignalR有两种连接,分为Persistent Connection(永久连接) 与 Hubs。
Persistent Connection:表示一个发送单个,编组,广播信息的简单终结点。开发人员通过使用持久性连接Api,直接访问SignalR公开的底层通信协议。
二、Hubs
是基于连接Api的更高级别的通信管道,它允许客户端和服务器上彼此直接调用方法,SignalR能够很神奇地处理跨机器的调度,使得客户端和服务器端能够轻松调用在对方端上的方法。使用Hub还允许开发人员将强类型的参数传递给方法并且绑定模型。
4种方式:
【轮询】:(polling以前的方式)客户端以一定时间间隔中向服务器发送Ajax查询请求大,但是也因此,当服务器端内容并没有显著变化时,这种连接方式将带来很多无效的请求,造成服务器资源损耗。适合并发量小,实时性要求低的应用模型,更像是定时任务。优点:实现最为简单,配置简单,出错几率小. 缺点:每次都是一次完整的http请求,易延迟,有效请求命中率少,并发较大时,服务器资源损耗大。
【长轮询】(long polling)长轮询是对轮询的改进,客户端通过请求连接到服务器,并保持一段时间的连接状态,直到消息更新或超时才返回Response并中止连接,可以有效减少无效请求的次数。属于Comet实现. 优点:有效减少无效连接,实时性较高.缺点:客户端和服务器端保持连接造成资源浪费,服务器端信息更新频繁时,long polling并不比polling高效,并且当数据量很大时,会造成连续的polls不断产生,性能上反而更糟糕。
【WebSocket 】HTML5提供的一种在单个 TCP 连接上进行全双工通讯的协议,目前chrome、Firefox、Opera、Safari等主流版本均支持,Internet Explorer从10开始支持。另外因为WebSocket 提供浏览器一个原生的 socket实现,所以直接解決了 Comet 架构很容易出错的问题,而在整個架构的复杂度上也比传统的实现简单得多。优点:服务器与客户端之间交换的数据包档头很小,节约带宽。全双工通信,服务器可以主动传送数据给客户端。缺点:旧版浏览器不支持。
三、使用条件
1、正在使用跨域连接,并且符合以下条件(以下不满足任一条则使用长轮询)
- 客户端支持CORS;
- 客户端支持WebSocket;
- 服务器端支持WebSocket ;
2、不配置使用JSONP,连接不跨域并且客户端和服务器端都支持WebSocket
- 客户端支持CORS;
- 客户端支持WebSocket;
- 服务器端支持WebSocket。
- ServerSendEvent 客户端或服务器端不支持Websocket时使用
- Forever Frame EventSource不可用(基本上除了IE外都支持)时使用