基于ASP.NETSignalR的实时Web功能的实现
2016-11-14李燕
李燕
摘要:传统Web网站中客户端获取服务器数据只能刷新页面或使用Ajax轮询才能实现实时显示数据,微软开发的SignalR服务端可主动向客户端推送数据,实现了客户端与服务器实时数据通信。该文介绍了SiganlR技术及在Web网站中的应用。
关键词:实时通信;实时Web功能;数据总线;SignalR
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)24-0062-02
1 概述
在网站开发中经常需要实现实时Web功能,即当所连接的客户端变得可用时服务器代码可立即向其推送内容,而不是让服务器等待客户端请求新的数据。在以前的Web网站技术中,客户端要获取服务器数据需通过不停地发送请求来轮询服务端数据。这种发送Ajax请求给服务器的方式,在用户量很大的情况下给服务器带来很大的压力,而定时刷新很多时候满足不了对实时性要求较高的需求,比如聊天室应用,管制现场流控信息传递等,都要求实时更新。ASP.NET SignalR是这一问题比较好的解决方案。
2 SignalR概述
SignalR是微软对Web开发技术栈的扩充,是一种可用来简化交互式实时多用户Web应用程序开发的框架,利用SignalR,可以真正实现了Web客户端和服务器之间双向通信。服务器可以将内容推送到已连接的客户端。
SignalR提供一个简单的API用于创建服务器端到客户端的远程过程调用,以便从服务器端.Net代码中调用客户端浏览器中的JavaScript函数。SignalR还包括用于管理连接(例如连接和断开连接事件)和为连接分组的API。SignalR会自动管理连接,允许向所有连接的客户端同时发送消息,也可以向特定客户端发送消息。客户端和服务端的连接是持久性的,不像传统的HTTP连接——每次通信都需要重新建立一个连接。
SignalR是对一组在构建客户端和服务器之间的real-time功能所需要使用的传输技术的抽象。SignalR连接首先以HTTP发起请求,然后如果WebSocket可用的话,则升级到WebSocket连接。WebSocket是SignalR的理想传输方式,因为它能够高效的使用服务器的内存、有最低的延迟,而且有最主要的功能(客户端和服务器之间的全双工通信),但它也有最严格的环境要求:WebSocket要求服务器是Windows Server2012或Windows8以及.NET Framework4.5。如果不满足这些要求,SignalR将尝试使用其他传输方式来建立连接。总之,SignalR以一种相对于开发者透明的方式确定服务器和客户端之间最佳的通信技术方案(长轮询、forever frame、Server-Sent Events、WebSocket),然后使用这种技术创建一条底层的连接并保持该连接的永久开放,并对连接的断开和重连接进行自动管理,如图1所示:
SignalR在用来保持和服务器连接的传输层之上还存在着两个不同的抽象层,它们构成了使用所建立虚拟连接的两个API或两套规则。其中一个被称作持久连接(Persistent Connection),这是一个较低的层,因此离真实的连接较近,提供了一个非常类似套接字编程的开发API。第二个抽象层基于一个称为Hub的组件,是一个建立于连接API的高级管道。基于Javascript的灵活性和C#的动态特性,Hub消弭了客户端和服务器这两个独立物理环境之间的界限,它使得客户端调用服务端的方法简单得犹如调用本地方法一样,反之亦然。使用Hub还可以将强类型参数传递给方法,并且可用绑定模型。这两个抽象层之间的关系如图2所示:
SignalR允许我们透明地在客户端和服务器之间直接进行方法调用,是如何做到的呢?这并没有什么神奇之处,为了实现这样的功能,SignalR将借助服务器Hub类在客户端自动创建代理对象,并在它们的方法中输入对它们实际方法的远程调用。相反,当服务器调用客户端某个方法时,它将被一个在服务端“打包”这些调用的动态类型的特殊协议所解析,并使用底层传输通过推送(push)将它们发送到其它端点。然后它们将到达客户端,并在这里进行解析和执行。过程如下图所示:
4 结束语
SignalR是实现实时通信功能的有效解决方案,利用SignalR可以创建对消息实时性要求比较高的应用,如在线协作工具、多用户游戏、实时信息服务等。在Web应用方面,如果有通过刷新页面来查看数据或者是通过页面实现长轮询来检索数据等需求,那么就可以考虑使用SiganlR了。
参考文献:
[1] Patrick Fletcher. [EB/OL]http://www.asp.net/signalr/overview[E B/OL].
[2] 张占岭.SignalR实现服务器与客户端的实时通信[Z].