SignalR

  从上面的介绍能够看出,SignalR既然是为实时而生的,这样就决定了其使用场所。具体适用情景有以下几点:javascript

 

 

Asp.net SignalR是微软为实现实时通讯的一个类库。通常状况下,signalR会使用JavaScript的长轮询(long polling)的方式来实现客户端和服务器通讯,随着Html5中WebSockets出现,SignalR也支持WebSockets通讯。另外SignalR开发的程序不单单限制于宿主在IIS中,也能够宿主在任何应用程序,包括控制台,客户端程序和Windows服务等,另外还支持Mono,这意味着它能够实现跨平台部署在Linux环境下。java

  signalR内部有两类对象:jquery

      1. Http持久链接(Persisten Connection)对象:用来解决长时间链接的功能。还能够由客户端主动向服务器要求数据,而服务器端不须要实现太多细节,只须要处理PersistentConnection 内所提供的五个事件:OnConnected, OnReconnected, OnReceived, OnError 和 OnDisconnect 便可。
      2. Hub(集线器)对象:用来解决实时(realtime)信息交换的功能,服务端能够利用URL来注册一个或多个Hub,只要链接到这个Hub,就能与全部的客户端共享发送到服务器上的信息,同时服务端能够调用客户端的脚本。SignalR将整个信息的交换封装起来,客户端和服务器都是使用JSON来沟通的,在服务端声明的全部Hub信息,都会生成JavaScript输出到客户端,.NET则依赖Proxy来生成代理对象,而Proxy的内部则是将JSON转换成对象。

 

SignalR将整个信息的交换封装起来,客户端和服务器都是使用JSON来沟通的,在服务端声明的全部Hub信息,都会生成JavaScript输出到客户端,.NET则依赖Proxy来生成代理对象,而Proxy的内部则是将JSON转换成对象。api


SignalR的服务端提供了两种实现方式,分别是PersistentConnection和Hub,这两种方式的侧重点不一样:服务器

  PersistentConnection Hub/生成Proxy模式 Hub/非生成Proxy模式
服务端配置

app.Map("/messageConnection", map => 
           { 
               map.RunSignalR<MessageConnection>(); 
           });cookie

app.Map("/messageHub", map => 
           { 
               map.RunSignalR(new Microsoft.AspNet.SignalR.HubConfiguration { EnableJavaScriptProxies = true }); 
           });app

app.Map("/messageHub", map => 
            { 
                map.RunSignalR(new Microsoft.AspNet.SignalR.HubConfiguration { EnableJavaScriptProxies = true }); 
            });cors

引入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() 
                .done(function () { 
                    connected = true; 
                }) 
                .fail(function () { 
                    alert("链接失败"); 
                });dom

connection.hub.start() 
                .done(function () { 
                    connected = true; 
                }) 
                .fail(function () { 
                    alert("链接失败"); 
                });ide

connection.start() 
                .done(function () { 
                    connected = true; 
                }) 
                .fail(function () { 
                    alert("链接失败"); 
                });

代理对象 var proxy = connection.MessageService; 
MessageService是Hub的名称
var proxy = connection.createHubProxy("MessageService"); 
MessageService是Hub的名称
定义客户端方法

proxy.client.hello = function (message) { 
                      console.log(message);   

}

proxy.on("hello", function (message) {        

                  console.log(message);

});

接收消息

connection.received(function (message) { 
                alert(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";

示例代码下载

 

 

docs.microsoft t


容易碰到的问题:

 

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

相关文章
相关标签/搜索