You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Server App中Application Insight关联及日志记录异常问题

Blazor Server Application Insight 日志缺失、关联异常解决方案

Blazor Server 基于 SignalR 长连接实现用户交互,和传统 ASP.NET Core Web 应用的请求模式差异较大,默认 Application Insights 采集规则仅覆盖标准 HTTP 请求,无法捕获 Blazor 内部的页面导航、SignalR 交互行为,因此会出现页面请求日志缺失、调用链关联断裂的问题,需要额外补充配置。


1. 完善服务注册配置

首先补充 Application Insights 基础配置,开放 SignalR 端点的请求采集,同时注册必需的服务:

public void ConfigureServices(IServiceCollection services)
{
    // 注册Http上下文访问器,用于关联ID传递
    services.AddHttpContextAccessor();
    
    services.AddApplicationInsightsTelemetry(opt =>
    {
        // 启用依赖项跟踪,覆盖HTTP调用、数据库操作等场景
        opt.EnableDependencyTrackingTelemetryModule = true;
        // 启用请求跟踪,包含SignalR请求
        opt.EnableRequestTrackingTelemetryModule = true;
        // 移除/_blazor端点的采集过滤规则
        if (opt.RequestCollectionOptions.ExcludePathStartsWith.Contains("/_blazor"))
        {
            opt.RequestCollectionOptions.ExcludePathStartsWith.Remove("/_blazor");
        }
    });
    
    // 注册自定义遥测初始化器,保证调用链关联ID正确传递
    services.AddSingleton<ITelemetryInitializer, BlazorCorrelationTelemetryInitializer>();
    
    // 原有Blazor相关服务注册
    services.AddRazorPages();
    services.AddServerSideBlazor();
}

2. 实现自定义遥测初始化器

创建自定义类保证所有遥测数据的关联ID统一,解决调用链断裂问题:

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.AspNetCore.Http;

public class BlazorCorrelationTelemetryInitializer : ITelemetryInitializer
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public BlazorCorrelationTelemetryInitializer(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void Initialize(ITelemetry telemetry)
    {
        var httpContext = _httpContextAccessor.HttpContext;
        if (httpContext == null) return;
        
        // 提取当前请求的遥测上下文,统一关联ID
        if (httpContext.Items.TryGetValue("Microsoft.ApplicationInsights.RequestTelemetry", out var requestObj) 
            && requestObj is RequestTelemetry requestTelemetry)
        {
            telemetry.Context.Operation.Id = requestTelemetry.Context.Operation.Id;
            telemetry.Context.Operation.ParentId = requestTelemetry.Id;
        }
    }
}

3. 手动采集Blazor页面导航事件

Blazor的页面导航属于客户端路由,不会触发标准HTTP请求,需要手动监听导航事件上报页面访问日志,可在MainLayout.razor中添加以下代码:

@inject NavigationManager NavigationManager
@inject Microsoft.ApplicationInsights.TelemetryClient TelemetryClient

protected override void OnInitialized()
{
    // 监听全局导航事件,上报页面访问遥测
    NavigationManager.LocationChanged += (sender, args) =>
    {
        var pageUri = new Uri(args.Location);
        TelemetryClient.TrackPageView(new PageViewTelemetry
        {
            Name = pageUri.AbsolutePath,
            Url = pageUri
        });
    };
}

完成以上配置后,Blazor Server的所有页面导航、HTTP调用、数据库操作都会被正常采集,调用链关联功能也会恢复正常。

内容的提问来源于stack exchange,提问作者Pankaj Rawat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 15:15:02