如何在 Blazor Server 中获取访客数和连接数
内容提要
在Blazor Server开发中,可以通过自定义CircuitHandler获取访客的连接数和访客数量。通过静态方法记录Circuit连接的客户端,并且线程安全。在Program.cs中注入CircuitTracker,并在页面中加入获取浏览器指纹的js代码。通过实现例子可以实现获取连接数和访客数量的功能。
延伸解读
连接数与访客数的区别
文章明确区分了连接数和访客数:连接数指一个访客打开多个页面产生的Circuit连接总数,而访客数则通过浏览器指纹去重后统计唯一访客。实现中,连接数直接取CircuitClients字典的计数,访客数则对VisitorClients按值分组后计数。这种区分有助于在监控或限流场景中准确评估实际用户规模。
线程安全与生命周期管理
代码使用ConcurrentDictionary静态字段存储连接和访客信息,确保多线程下的安全访问。CircuitTracker以Scoped生命周期注入,每个客户端连接获得独立实例,从而在OnConnectionUpAsync和OnConnectionDownAsync中准确添加和移除记录。这种设计避免了连接泄漏,但需注意静态字典在应用重启后会清空。
浏览器指纹的获取时机
访客ID通过JavaScript调用FingerprintJS库获取,由于依赖浏览器环境,必须在组件渲染完成后调用。示例在OnAfterRenderAsync的firstRender分支中执行,并通过IJSRuntime调用getVisitorId函数,然后将结果注册到跟踪器。这保证了指纹获取的可靠性,但若JS加载失败或用户禁用脚本,访客统计可能不准确。
Q&A
如何在Blazor Server中获取访客的连接数和数量?
可以通过自定义CircuitHandler来记录连接信息,并使用静态方法实现线程安全的全局连接记录。
CircuitHandler在Blazor Server中有什么作用?
CircuitHandler用于拦截和处理客户端与服务器之间的连接,能够记录连接的客户端信息。
如何确保连接记录的线程安全?
通过使用ConcurrentDictionary来存储连接信息,确保在多线程环境下的安全访问。
如何在Blazor Server中注入CircuitTracker?
在Program.cs中以Scoped生命周期注入CircuitTracker,使用builder.Services.AddScoped<CircuitHandler, CircuitTracker>()。
如何获取唯一访客的浏览器指纹?
可以在页面中加入JavaScript代码,使用FingerprintJS库来获取访客的唯一ID。
在Blazor Server中如何显示连接数和访客数量?
在页面中使用@inject注入CircuitTracker,并通过其属性显示连接数和访客数量。