时间:2025-04-17 11:05
人气:
作者:admin
SignalR是一个开源的库,跨平台;让Web应用与其他应用通讯变得很简单,Web服务端可以实时的将内容推送给对应的客户端,客户端发送的信息也可以实时到其他客户端。
SignalR提供了一种远程过程调用(RPC)的方式,使得客户端可以调用服务器的方法,同样在服务器端的方法中也能调用客户端的方法。
SignalR支持如下的方式实现实时通信:
SignalR会自动选择服务器和客户端能力范围内的最佳通信方式(是不是很优秀) ,当然也可以手动指定。
其实对于Web模式下的实时通信,SignalR用上试试,感觉还是很给力的。
hub类
public class ChatHub : Hub
{
private static readonly ConcurrentDictionary<string, User> ChatClientDict = new(); //用户字典
/// <summary>
/// 给所有人发消息
/// </summary>
/// <param name="userId"></param>
/// <param name="msg"></param>
/// <returns></returns>
public async Task SendMsg(long userId, string msg)
{
string sendMsg = $"用户名{Context.ConnectionId}:{msg}";
//服务端推送给 除自已以外 的所有客户端
//await Clients.Others.SendAsync("ReceiveMsg", sendMsg);
//服务端推送给所有客户端
await Clients.All.SendAsync("ReceiveMsg", sendMsg);
}
/// <summary>
/// 给指定人员发消息
/// </summary>
/// <param name="userId"></param>
/// <param name="message"></param>
/// <returns></returns>
/// <exception cref="ArgumentException"></exception>
public async Task SendMessageToUser(string userId, string message)
{
// 确保用户ID是有效的
if (string.IsNullOrEmpty(userId))
{
throw new ArgumentException("Invalid user ID", nameof(userId));
}
await Clients.Client(userId).SendAsync("ReceiveToUserMsg", message);
}
//客户端成功连接时,会触发此方法
public override Task OnConnectedAsync()
{
var cid = Context.ConnectionId;
//根据id获取指定客户端
var client = Clients.Client(cid);
return Task.CompletedTask;
}
//客户端断开连接时,会触发此方法
public override Task OnDisconnectedAsync(Exception? exception)
{
return Task.CompletedTask;
}
//客户端调用服务端更新数据时,会触发此方法
public async Task UpdateMessage(MsgInfo ReceiveMessage)
{
await Clients.All.SendAsync("UpdateData", ReceiveMessage);
}
}
业务API编写,推送消息
IHubContext<ChatHub> _hubContext 定义一个hub上下文,通过这个可以获取所有客户端,并进行方法调用PushMessage,推送消息

注册相关服务及管道

客户端的核心代码:
客户端调用服务端的chathub类中的UpdateMessage方法,将客户端数据更新到服务端

服务端与客户端的交互逻辑

数据展示

Microsoft Agent Framework Skills 执行 Scripts(实
EF Core 原生 SQL 实战:FromSql、SqlQuery 与对