如何在 Blazor Server 中获取访客数和连接数

💡 原文中文,约3700字,阅读约需9分钟。
📝

内容提要

在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,并通过其属性显示连接数和访客数量。

🏷️

标签

➡️

继续阅读