ASP.NET Core SignalR:集线器Hub
一、什么是集線器hubs
通過SignalR的集線器hubs中定義的方法,服務(wù)器可以調(diào)用連接中的客戶端定義的方法,而客戶端也可以調(diào)用服務(wù)器端集線器中定義的方法。SignalR負(fù)責(zé)實現(xiàn)了客戶端和服務(wù)器之間的實時通信。
二、配置SignalR的hubs
SignalR通過在Startup.ConfigureServices中調(diào)用services.AddSignalR()來配置中間件服務(wù)。
將 SignalR 功能添加到 ASP.NET Core 應(yīng)用程序時,通過在Startup.Configure方法中調(diào)用app.UseSignalR來設(shè)置 SignalR 路由。
app.UseSignalR(routes =>{
routes.MapHub<BaseHub>("/Hub");
});
?三、創(chuàng)建集線器Hubs
通過繼承Hub類來創(chuàng)建集線器類,并添加public修飾的方法。可以通過特性[HubMethodName]來修改方法的名稱。
public async Task SendMessage(string user,string message){
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
注意:?
客戶端只能調(diào)用集線器類中定義的public的方法。
每次客戶端訪問服務(wù)器的集線器類的時候都是在新的對象實例上運行的,所以不能將狀態(tài)存儲在集線器類中。
SignalR的代碼是異步模式的,所以集線器中的方法也都是異步的。
四、參數(shù)和返回類型
將集線器類和客戶端接收代碼改為如下所示:
public class paramsEntity{
public string user { get; set; }
public string message { get; set; }
}
public async Task SendMessage(paramsEntity param)
{
await Clients.All.SendAsync("ReceiveMessage", param);
}//接收服務(wù)器端消息ReceiveMessage的處理程序
connection.on("ReceiveMessage", function (param) {
if (param.user)
$('#content').append(param.user + ":");
if (param.message)
$('#content').append(param.message + ":");
});
//發(fā)送消息至服務(wù)器端SendMessage方法
connection.invoke("SendMessage", { user, message }).catch(function (err) {
return console.error(err.toString());
});
通過運行可以發(fā)現(xiàn),SignalR會通過序列化和反序列化來處理復(fù)雜的參數(shù)和返回類型。如果客戶端傳遞的參數(shù)和服務(wù)器端不一致會導(dǎo)致方法無法被匹配到而報錯以下錯誤。
Microsoft.AspNetCore.SignalR.HubException: Failed to invoke 'SendMessage' due to an error on the server.所以使用自定義對象作為參數(shù)更加的靈活多變。
五、Hub的對象
1、Context
Hub類具有一個上下文Context,包含連接中的以下屬性以及方法。
| 屬性 | 描述 |
| ConnectionId | 獲取由 SignalR 分配的連接的唯一 ID。每個連接都有一個連接 ID |
| UserIdentifier | 獲取用戶標(biāo)識符。?默認(rèn)情況下,SignalR 使用ClaimTypes.NameIdentifier與連接ClaimsPrincipal關(guān)聯(lián)的作為用戶標(biāo)識符。 |
| User | 獲取與ClaimsPrincipal當(dāng)前用戶關(guān)聯(lián)的。 |
| Items | 獲取可用于在此連接的范圍內(nèi)共享數(shù)據(jù)的鍵/值集合。數(shù)據(jù)可以存儲在此集合中,它將在不同的集線器方法調(diào)用中持久保存。 |
| Features | 獲取連接上的可用功能的集合。目前,在大多數(shù)情況下不需要此集合,因此不會對其進行詳細介紹。 |
| ConnectionAborted | 獲取一個CancellationToken,它將在連接中止時通知。 |
| 方法 | 描述 |
| GetHttpContext | 返回連接HttpContext的null,如果連接不與 HTTP 請求關(guān)聯(lián),則為。對于 HTTP 連接,可以使用此方法來獲取 HTTP 標(biāo)頭和查詢字符串等信息。 |
| Abort | 中止連接。 |
2、Clients
Hub類的Clients屬性包含服務(wù)器和客戶端之間通信的方法和屬性。
| 屬性 | 描述 |
| All | 在所有連接的客戶端上調(diào)用方法 |
| Caller | 在調(diào)用集線器方法的客戶端上調(diào)用方法 |
| Others | 在所有連接的客戶端上調(diào)用方法,但調(diào)用方法的客戶端除外 |
| 方法 | 描述 |
| AllExcept | 在所有連接的客戶端(指定的連接除外)上調(diào)用方法 |
| Client | 在特定連接的客戶端上調(diào)用方法 |
| Clients | 在多個特定連接的客戶端上調(diào)用方法 |
| Group | 對指定組中的所有連接調(diào)用方法 |
| GroupExcept | 對指定組中的所有連接調(diào)用方法,指定的連接除外? |
| Groups | 在多組連接上調(diào)用方法 |
| OthersInGroup | 對一組連接調(diào)用方法,而不包括調(diào)用該集線器方法的客戶端 |
| User | 對與特定用戶關(guān)聯(lián)的所有連接調(diào)用方法 |
| Users | 對與指定用戶相關(guān)聯(lián)的所有連接調(diào)用方法 |
表中的每個屬性或方法都返回一個SendAsync包含方法的對象。?SendAsync方法允許你提供要調(diào)用的客戶端方法的名稱和參數(shù)。
六、強類型的hub
使用SendAsync的時候需要傳入字符串來指定調(diào)用客戶端的方法,這就會導(dǎo)致拼寫錯誤等問題引發(fā)程序運行錯誤。
通過使用強類型Hub<T>將客戶端的方法約定為接口,這樣Hub的Clients的將會禁用Sendasync方法,而只能調(diào)用我們約定的接口方法。
public interface IHub{
Task ReceiveMessage(string user, string message);
Task ReceiveMessage(string message);
} public class BaseHub : Hub<IHub>
{
public async Task SendMessage(string user, string message)
{
await Clients.All.ReceiveMessage(user, message);
}
}
?七、處理連接事件
SignalR的hub提供OnConnectedAsync和OnDisconnectedAsync虛擬方法來管理和跟蹤連接。?重寫OnConnectedAsync虛擬方法,以便在客戶端連接到集線器時執(zhí)行操作,如將其添加到組。
public override async Task OnConnectedAsync(){
await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
await base.OnConnectedAsync();
}
重寫OnDisconnectedAsync虛擬方法,以便在客戶端斷開連接時執(zhí)行操作。?如果客戶端故意斷開連接(例如connection.stop(),通過調(diào)用),則exception參數(shù)將為null。?但是,如果客戶端由于錯誤(例如網(wǎng)絡(luò)故障)而斷開連接,則exception參數(shù)將包含描述失敗的異常。
public override async Task OnDisconnectedAsync(Exception exception){
await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users");
await base.OnDisconnectedAsync(exception);
}
原文鏈接:https://www.cnblogs.com/xwc1996/p/11530341.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core SignalR:集线器Hub的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最全的 netcore 3.0 升级实战
- 下一篇: 微软发布.Net Core 3.0 RC