什么是Asp.Net Core SignalRAsp.Net Core SignalR 是微軟開發(fā)的一套基于Asp.Net Core的與Web進行實時交互的類庫,它使我們的應(yīng)用能夠?qū)崟r的把數(shù)據(jù)推送給Web客戶端。 功能
SignalR 提供了多種連接方式,在現(xiàn)代化應(yīng)用中,WebSocket是最佳的傳輸協(xié)議,在客戶端無法實現(xiàn)WebSocket協(xié)議的時候,SignalR就會采取其他方式,比如Server-Sent或者長輪詢(在ws未出現(xiàn)之前,我們討論的推拉模式) 中心 HubsSignalR是采用中心客戶端和服務(wù)器進行通訊。 中心是一種高級的管道,允許客戶端和服務(wù)器之間相互調(diào)用方法。 中心通過強類型參數(shù)傳遞給方法,進行模型綁定 Hubs.ClientsClients屬性包含了所有的客戶端連接信息,它包含了3個屬性:
每個屬性和方法返回的對象都包含一個SendAsync方法,可以對客戶端進行調(diào)用。 HubContext可以在應(yīng)用其他地方通過使用IHubContext,達到調(diào)用Hub的目的。 兩種協(xié)議
MessagePack類似于JSON,但傳輸比JSON更快,數(shù)據(jù)大小比JSON更小 服務(wù)器事項
代碼解析微軟官方示范中的ChatHub: using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRChat.Hubs { public class ChatHub : Hub { //服務(wù)端方法 public async Task SendMessage(string user, string message) { //ReceiveMessage 為客戶端方法,讓所有客戶端調(diào)用這個方法 await Clients.All.SendAsync("ReceiveMessage", user, message); } } } 上述代碼為當(dāng)收到客戶端發(fā)來的SendMessage請求后(發(fā)送聊天信息),我們把消息發(fā)送到所有客戶端,讓他們調(diào)用自身的ReceiveMessage方法。 用戶標識通常情況下,在用戶進行連接后,Connection會保存用戶的用戶標識,以便對特定用戶進行發(fā)送消息。 可以實現(xiàn)IUserIdProvider來自定義獲取用戶的方法,例如: public class CustomUserIdProvider : IUserIdProvider { public virtual string GetUserId(HubConnectionContext connection) { return connection.User?.FindFirst(ClaimTypes.Email)?.Value; } } 在Startup.ConfigureServices中注冊: services.AddSingleton<IUserIdProvider, CustomUserIdProvider>(); Group 分組分組類似于聊天室中的每個房間,通過分組,我們可以給特定小組發(fā)送消息。
微信小程序與SignalR交互小程序因為無法直接使用websocket,所以無法使用signalR.js,你可以試著把signalR.js中的webcosket使用部分換成wx.xxSocketxxx。 在參考了算神的代碼后,歸了一個小類庫,方便大家使用,源碼較長,我放到了github上,點擊【傳送門】進入。 如何使用調(diào)用類庫在要使用的頁面上: ///引入這個類庫 var signalR = require('../../lib/signalr/signalr.js') ///實例化一個對象 let _client = new signalR.signalR(); 創(chuàng)建 一個映射方法這是為了讓小程序收到SignalR的消息之后進行回調(diào) callMethods(methods, args) { console.log(methods, args); let self = this; switch (methods) { case 'sayHello': self.sayHello(args[0]); break; } }, 例子里有一個sayHello方法,我們用字符串作為key。 進行連接_client.connection(url, methodMapping);
調(diào)用SignalR方法_client.call(methodName, args, success, fail)
寫在最后最近真的忙,忙成一道閃電,正好遇到這個問題隨之記錄下。類庫可能并不完善,你可以在github上提issue,我會跟進的,有好的修改方式,你也可以PR我。 |
工作日 8:30-12:00 14:30-18:00
周六及部分節(jié)假日提供值班服務(wù)