如何查看生产环境Blazor应用的当前在线用户?
查看Blazor应用当前在线用户的方法
可以通过SignalR Hub跟踪客户端连接,实现实时查看在线用户及数量的功能,具体步骤如下:
1. 改造SignalR Hub维护在线用户
在你的SignalR Hub类中,用线程安全的集合记录每个连接对应的用户信息,利用OnConnectedAsync和OnDisconnectedAsync钩子维护列表:
public class AppHub : Hub { // 线程安全集合,键=连接ID,值=用户名(根据你的认证字段调整) private static readonly ConcurrentDictionary<string, string> _onlineUsers = new(); public override async Task OnConnectedAsync() { // 从认证上下文获取当前用户名,需确保Blazor已配置认证 var userName = Context.User?.FindFirst(ClaimTypes.Name)?.Value; if (!string.IsNullOrEmpty(userName)) { _onlineUsers.TryAdd(Context.ConnectionId, userName); } await base.OnConnectedAsync(); } public override async Task OnDisconnectedAsync(Exception? exception) { _onlineUsers.TryRemove(Context.ConnectionId, out _); await base.OnDisconnectedAsync(exception); } // 静态方法供外部获取去重后的在线用户列表 public static List<string> GetOnlineUsers() { return _onlineUsers.Values.Distinct().ToList(); } // 获取总连接数(含同一用户多设备连接) public static int GetTotalConnections() { return _onlineUsers.Count; } }
2. 配置SignalR Hub
在Program.cs中注册并映射Hub:
builder.Services.AddSignalR(); // ... app.MapHub<AppHub>("/appHub");
3. 实现查询接口或页面
方式一:后端API查询
写一个API接口,方便发布前调用查看:
[ApiController] [Route("api/online-users")] public class OnlineUsersController : ControllerBase { [HttpGet] public IActionResult Get() { var users = AppHub.GetOnlineUsers(); return Ok(new { 在线用户数 = users.Count, 具体用户 = users }); } }
发布前直接请求这个接口就能拿到当前在线用户信息。
方式二:Blazor页面展示
如果需要可视化查看,可在Blazor中添加一个仅管理员可见的页面,直接调用静态方法展示:
@page "/admin/online-users" @using System.Linq <h3>当前在线用户</h3> <p>总连接数: @AppHub.GetTotalConnections()</p> <p>去重用户数: @AppHub.GetOnlineUsers().Count()</p> <ul> @foreach (var user in AppHub.GetOnlineUsers()) { <li>@user</li> } </ul>
注意事项
- 若为多容器负载均衡部署,静态集合仅对当前容器有效,需改用Redis等分布式缓存存储在线用户数据,确保跨实例数据一致。
- 需保证Blazor应用已正确配置用户认证,否则
Context.User无法获取用户信息,只能统计连接数而非具体用户。 - 可扩展集合存储更多用户信息(如用户ID、最后活跃时间),用于更精准的使用状态判断。
内容的提问来源于stack exchange,提问作者Foitn
相关产品推荐
相关产品推荐

