一、什么是SingalR?
SingalR是一种能够让客户端和服务端实时通信,服务端可以主动推送消息到客户端的技术。以往的十几年里,客户端要想实时与服务器通信,只有通过长轮询和AJAX,服务器永远是被动的。
二、SingalR是怎么实现的?
首先SignalR提供客户端和服务端之间的持久连接,其次在SignalR中,服务端代码使用远程过程调用(RPC)调用浏览器中的客户端代码,而不是请求-响应模式。
如果是双向通信:客户端通过RPC调用服务端的同名的方法,服务端更新数据后调用客户端的同名方法,客户端收到数据后进行显示。
如果是消息推送:服务端通过RPC调用客户端同名方法,客户端收到数据后显示即可。
三、一个实例解析SignalR
namespace SignalRDemo
{
[HubName("rateHub")]
public class RateHub : Hub
{
//don't do this in real project
private static int _rating;
public void Rate()
{
_rating += 1;
Clients.All.rateUpdate(_rating);
}
}
}
当html页面触发Rate()方法时(客户端调用服务端的代码),调用所有客户端的rateUpdate()方法(服务端调用客户端的代码),将结果推送到客户端。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Rating</title>
</head>
<body>
<h2>Please rate</h2>
<input type="button" id="vote" value="Good (0)" />
<script src="Scripts/jquery-1.6.4.js"></script>
<script src="Scripts/jquery.signalR-2.2.0.js"></script>
<script type="text/javascript">
$(function () {
var con = $.hubConnection();
var hub = con.createHubProxy("rateHub");
hub.on('rateUpdate', function (count) {
$('#vote').val("Good (" + count + ")");
});
con.start().done(function () {
$('#vote').click(function () {
hub.invoke("Rate");
});
});
});
</script>
</body>
</html>
先声明一个连接,然后创建一个Hub:createHubProxy("rateHub")
中使用的就是Hub的名字(HubName)。接下来添加rateUpdate事件处理,即更新点赞数(rateUpdate被服务器端的Hub调用)。最后启动Hub,添加点赞按钮的事件处理(调用服务器端的Hub的Rate方法)。