ASP .NET Core 8实现实时Web功能

发布于:2025-07-18 ⋅ 阅读:(17) ⋅ 点赞:(0)

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();


网站公告

今日签到

点亮在社区的每一天
去签到