從上面的介紹可以看出,SignalR既然是為實時而生的,這樣就決定了其使用場所。具體適用情景有如下幾點: 聊天室,如線上客服系統,IM系統等 股票價格實時更新 消息的推送服務 游戲中人物位置的實時推送 : 游戲參考 https://blog.csdn.net/jaswhen/article/deta ...
從上面的介紹可以看出,SignalR既然是為實時而生的,這樣就決定了其使用場所。具體適用情景有如下幾點:
- 聊天室,如線上客服系統,IM系統等
- 股票價格實時更新
- 消息的推送服務
- 游戲中人物位置的實時推送 : 游戲參考 https://blog.csdn.net/jaswhen/article/details/48517999
Asp.net SignalR是微軟為實現實時通信的一個類庫。一般情況下,signalR會使用JavaScript的長輪詢(long polling)的方式來實現客戶端和伺服器通信,隨著Html5中WebSockets出現,SignalR也支持WebSockets通信。另外SignalR開發的程式不僅僅限制於宿主在IIS中,也可以宿主在任何應用程式,包括控制台,客戶端程式和Windows服務等,另外還支持Mono,這意味著它可以實現跨平臺部署在Linux環境下。
signalR內部有兩類對象:
- Http持久連接(Persisten Connection)對象:用來解決長時間連接的功能。還可以由客戶端主動向伺服器要求數據,而伺服器端不需要實現太多細節,只需要處理PersistentConnection 內所提供的五個事件:OnConnected, OnReconnected, OnReceived, OnError 和 OnDisconnect 即可。
- Hub(集線器)對象:用來解決實時(realtime)信息交換的功能,服務端可以利用URL來註冊一個或多個Hub,只要連接到這個Hub,就能與所有的客戶端共用發送到伺服器上的信息,同時服務端可以調用客戶端的腳本。SignalR將整個信息的交換封裝起來,客戶端和伺服器都是使用JSON來溝通的,在服務端聲明的所有Hub信息,都會生成JavaScript輸出到客戶端,.NET則依賴Proxy來生成代理對象,而Proxy的內部則是將JSON轉換成對象。
SignalR將整個信息的交換封裝起來,客戶端和伺服器都是使用JSON來溝通的,在服務端聲明的所有Hub信息,都會生成JavaScript輸出到客戶端,.NET則依賴Proxy來生成代理對象,而Proxy的內部則是將JSON轉換成對象。
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