ASP.NET Core SignalR 是一個開放源代碼庫,可用于簡化向應用添加實時 Web 功能。 實時 Web 功能使服務器端代碼能夠將內容推送到客戶端。
以下是 ASP.NET Core SignalR 的一些主要功能:
- 自動處理連接管理
- 同時向所有連接的客戶端發送消息。 例如聊天室
- 向特定客戶端或客戶端組發送消息
SignalR 支持以下用于處理實時通信的技術(按正常回退的順序):
- WebSocket
- Server-Sent 事件
- 長輪詢
ASP .NET Core中已經內置了SignalR了,所以使用起來很方便,只需創建Hub中心和啟用配置下SignalR即可。
1、創建強類型中心
使用?SendAsync
?的缺點在于,它依賴于字符串來指定要調用的客戶端方法。 如果客戶端中的方法名稱拼寫錯誤或缺失,則這會使代碼可能出現運行時錯誤。
將ChatHub客戶端方法提取到名為IChatClient接口中
/// <summary>
/// 聊天Hub客戶端接口
/// </summary>
public interface IChatClient
{/// <summary>/// 客戶端監聽廣播事件/// </summary>/// <param name="message">消息</param>/// <returns></returns>Task ReceiveBroadcast(string message);/// <summary>/// 客戶端監聽接收消息事件/// </summary>/// <param name="message">消息</param>/// <returns></returns>Task ReceiveMessage(string message);
}
創建強類型ChatHub?
/// <summary>
/// 聊天hub
/// </summary>
[Authorize]
public class ChatHub : Hub<IChatClient>
{/// <summary>/// 建立連接/// </summary>/// <returns></returns>public override async Task OnConnectedAsync(){await SendBroadcast(Context.UserIdentifier + ":online");await base.OnConnectedAsync();}/// <summary>/// 發送廣播/// </summary>/// <param name="message">消息</param>/// <returns></returns>public async Task SendBroadcast(string message){await Clients.All.ReceiveBroadcast(message);}/// <summary>/// 發送消息/// </summary>/// <param name="targetUserId">目標用戶</param>/// <param name="message">消息</param>/// <returns></returns>public async Task SendMessage(string targetUserId, string message){await Clients.User(targetUserId).ReceiveMessage(message);}/// <summary>/// 斷開連接/// </summary>/// <param name="exception"></param>/// <returns></returns>public override async Task OnDisconnectedAsync(Exception? exception){await SendBroadcast(Context.UserIdentifier + ":offline");await base.OnDisconnectedAsync(exception);}
}
注:?Clients.User(targetUserId)中targetUserId需要和授權令牌中ClaimTypes.NameIdentifier值一致,因為SignalR 使用與連接關聯的 ClaimTypes.NameIdentifier 中的 ClaimsPrincipal 作為用戶標識符。
?2、配置 SignalR 中心
?在Program.cs中
調用?AddSignalR方法,以注冊 SignalR 中心所需的服務
var builder = WebApplication.CreateBuilder(args);builder.Services.AddSignalR();var app = builder.Build();
在Program.cs中
調用 MapHub方法,以配置 SignalR 終結點
var app = builder.Build();app.MapHub<ChatHub>("/Chat");app.Run();