从上面的介绍能够看出,SignalR既然是为实时而生的,这样就决定了其使用场所。具体适用情景有以下几点:javascript
Asp.net SignalR是微软为实现实时通讯的一个类库。通常状况下,signalR会使用JavaScript的长轮询(long polling)的方式来实现客户端和服务器通讯,随着Html5中WebSockets出现,SignalR也支持WebSockets通讯。另外SignalR开发的程序不单单限制于宿主在IIS中,也能够宿主在任何应用程序,包括控制台,客户端程序和Windows服务等,另外还支持Mono,这意味着它能够实现跨平台部署在Linux环境下。java
signalR内部有两类对象:jquery
SignalR将整个信息的交换封装起来,客户端和服务器都是使用JSON来沟通的,在服务端声明的全部Hub信息,都会生成JavaScript输出到客户端,.NET则依赖Proxy来生成代理对象,而Proxy的内部则是将JSON转换成对象。api
SignalR的服务端提供了两种实现方式,分别是PersistentConnection和Hub,这两种方式的侧重点不一样:服务器
PersistentConnection | Hub/生成Proxy模式 | Hub/非生成Proxy模式 | |
服务端配置 | app.Map("/messageConnection", map => |
app.Map("/messageHub", map => |
app.Map("/messageHub", map => |
引入js文件 | jquery-1.6.4.min.js jquery.signalR-2.2.0.min.js |
jquery-1.6.4.min.js jquery.signalR-2.2.0.min.js /messageHub/js 上述js文件是动态生成,其中messageHub的为服务端定义的路径 |
jquery-1.6.4.min.js jquery.signalR-2.2.0.min.js |
建立链接 | var connection = $.connection("/message"); | var connection = $.connection; | var connection = $.hubConnection(); |
开启链接 | connection.start() |
connection.hub.start() |
connection.start() |
代理对象 | 无 | var proxy = connection.MessageService; MessageService是Hub的名称 |
var proxy = connection.createHubProxy("MessageService"); MessageService是Hub的名称 |
定义客户端方法 | 无 | proxy.client.hello = function (message) { } |
proxy.on("hello", function (message) { console.log(message); }); |
接收消息 | connection.received(function (message) { |
经过服务器调用客户端方法实现 |
经过服务器调用客户端方法实现 |
发送消息 | connection.send(message); | 经过调用服务端方法实现 proxy.server.hello(message); |
经过调用服务端方法实现 proxy.invoke("hello", message); |
设置QueryString | 在建立connection时指定 var connection = $.connection("/messageConnection", { username: "qs" + username }); |
connection.hub.qs = { username: "qs" + username }; |
connection.qs = { username: "qs" + username }; |
设置Cookie | document.cookie = "username=" + username; | document.cookie = "username=" + username; | document.cookie = "username=" + username; |
设置State | 无 | proxy.state.ClientType = "HubAutoProxy"; | proxy.state.ClientType = "HubNonAutoProxy"; |
示例代码下载
容易碰到的问题:
1.预约义的类型“Microsoft.CSharp.RuntimeBinder.Binder”未定义或未导入:https://blog.csdn.net/rztyfx/article/details/61432763
2.Owin:
Install-Package microsoft.owin.cors
Update-Package Owin -Reinstall
3.关于SignalR链接数量问题的记录:https://blog.csdn.net/Andrewniu/article/details/80243120