SignalR簡介
SignalR是一個.NET Core/.NET Framework的開源實時框架. SignalR的可使用
- Web Socket
- Server Sent Events
- Long Polling
作爲底層傳輸方式.
SignalR基於這三種技術構建, 抽象於它們之上, 它讓你更好的關注業務問題而不是底層傳輸技術問題.
SignalR這個框架分服務器端和客戶端, 服務器端支持ASP.NET Core 和 ASP.NET; 而客戶端除了支持瀏覽器裏的javascript以外, 也支持其它類型的客戶端, 例如桌面應用.
https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?view=aspnetcore-3.0&tabs=visual-studio
https://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction?view=aspnetcore-3.0
solenovex的SignalR講解 https://www.cnblogs.com/cgzl/p/9515516.html
使用
Step1
使用ASP.NET Core 3.0框架。添加signalr.js
。
C#項目中創建一個繼承Microsoft.AspNetCore.SignalR.Hub
的類,用於做傳輸控制。
配置SignalR。在Startup.cs
文件中services.AddSignalR()
與
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapHub<ChatHub>("/chatHub");
});
其中ChatHub
是實現的繼承類。/chatHub
與客戶端代碼js文件裏的連接項保持一致即可。
Step2
客戶端代碼的.cshtml
或html
文件裏需要引用兩個js文件。一個是SignalR的signalr.js
,一個是跟客戶端業務相關的如chat.js
。
chat.js
中,需要創建SignalR對象並綁定事件。這裏的"/chatHub"
與上文保持一致。
var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();
這裏需要注意的就是這幾種模式
connection.on();
connection.start().then();
connection.invoke();
connection.on();
用於接收消息。以方法名字符串的形式調用。connection.start().then();
用於連接建立成功後的處理。connection.invoke();
用於發送消息。調用方式與connection.on();
基本一致,都是通過方法名字符串加參數列表的形式。
剩下的就是與業務相關的前端頁面信息及邏輯了。
ps:connection
的使用可以查看signalr.js
代碼。
服務端與客戶端
服務端
命名空間爲Microsoft.AspNetCore.SignalR
。
通過繼承Hub
類派生控制器類。通過IHubContext<xxxHub>
實現依賴注入,無需使用全局單一實例。
使用Clients.User(userName)
與Clients.Group(groupName)
進行用戶與組的控制。
使用Context.ConnectionId
管理連接id。
使用自定義對象參數來確保向後兼容。
客戶端
命名空間Microsoft.AspNetCore.SignalR.Client
。
.Net客戶端。Java客戶端。JavaScript客戶端。
流式處理Stream
ASP.NET Core SignalR 支持從客戶端傳輸到服務器以及從服務器傳輸到客戶端。 這適用於數據片段隨着時間的推移而發生的情況。 流式傳輸時,每個片段一旦變爲可用,就會發送到客戶端或服務器,而不是等待所有數據都可用。
connection.stream
。一般SignalR連接,使用connection.on
來添加監聽器,但是在使用流式傳輸的時候,改用connection.stream
方法。從使用效果來看,stream有點像是invoke與on的組合結果。通過invoke調用服務端方法,並接收對應的流數據。stream裏添加方法,close
,next
,complete
,error
來應對各種需求。
https://www.cnblogs.com/lwqlun/p/9839305.html