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

相關文章
相關標籤/搜索