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