.NET 7 Web API:如何避免向Application Insights发送非HTTP操作的匿名用户/会话ID
解决Application Insights非HTTP操作导致用户计数不准确的问题
问题原因
你的Telemetry Initializer仅在存在自定义请求头时设置用户/会话ID,但在非HTTP场景(如后台定时任务、非请求触发的遥测)下,HttpContext为空,初始化器会直接跳过设置。此时Application Insights会自动生成匿名的User ID和Session ID,这些匿名条目会被统计为新用户,导致用户计数虚高。
解决方案
通过以下两点优化初始化器逻辑,精准控制用户/会话ID的生成:
- 仅在HTTP请求场景下处理用户/会话ID
- 非HTTP场景直接清空用户/会话ID,避免自动生成匿名ID
修改后的TelemetryInitializer代码
public class TelemetryInitializer : ITelemetryInitializer { private readonly IHttpContextAccessor _httpContextAccessor; public TelemetryInitializer(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public void Initialize(ITelemetry telemetry) { // 仅处理有HttpContext的HTTP请求场景 var httpContext = _httpContextAccessor?.HttpContext; if (httpContext == null) { // 非HTTP场景清空ID,阻止AI生成匿名用户/会话 telemetry.Context.User.Id = string.Empty; telemetry.Context.Session.Id = string.Empty; return; } // 尝试从请求头获取自定义会话ID if (!httpContext.Request.Headers.TryGetValue("MyHeader", out var customSessionId) || string.IsNullOrEmpty(customSessionId)) { // 无自定义头的HTTP请求,按需清空ID(若需保留默认统计可注释此段) telemetry.Context.User.Id = string.Empty; telemetry.Context.Session.Id = string.Empty; return; } // 设置自定义用户/会话ID telemetry.Context.Session.Id = customSessionId; telemetry.Context.User.Id = customSessionId; } }
额外说明
- 若后台任务需要关联特定用户,不要依赖初始化器,可在发送遥测时手动设置ID:
var telemetryClient = new TelemetryClient(); telemetryClient.Context.User.Id = "目标用户ID"; telemetryClient.Context.Session.Id = "目标会话ID"; telemetryClient.TrackEvent("后台任务执行完成"); - 如果你希望保留无自定义头的HTTP请求的默认用户统计,可删除
无自定义头的HTTP请求部分的清空逻辑。
内容的提问来源于stack exchange,提问作者Striker
相关产品推荐
相关产品推荐

