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

Blazor WebAssembly自定义DelegatingHandler首次请求不执行问题求助

Blazor WebAssembly自定义DelegatingHandler首次请求不执行问题求助

嘿,我来帮你排查这个首次请求Handler不触发的问题!这种情况在Blazor WASM开发里挺常见的,大概率和服务注册时机、HttpClient配置或者Handler本身的写法有关,我给你列几个最可能的原因和解决办法:

1. 先检查Handler里有没有调用基类的SendAsync方法

这是最容易踩的坑!我看你贴的代码没写完,一定要确认在SendAsync方法最后调用了await base.SendAsync(request, cancellationToken)——如果漏掉这行,你的请求根本发不出去,Handler的逻辑看似没执行,其实是被拦截在内部了。补全后的代码大概是这样:

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    try
    {
        Console.Error.WriteLine("Sending Request");
        var token = await _sessionStorage.ReadEncryptedItemAsync<object>("Token");
        if (token != null)
        {
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.ToString());
        }
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine($"Handler执行出错:{ex.Message}");
        // 这里别中断请求,继续发送无Token的请求,避免阻塞业务
    }
    // 关键:必须调用基类方法把请求发出去
    return await base.SendAsync(request, cancellationToken);
}

2. 检查Program.cs里的服务注册顺序

Blazor WASM对服务注册顺序很敏感,如果Handler和HttpClient的注册顺序错了,首次初始化的HttpClient可能没绑定到你的Handler上。正确的注册方式应该是先注册Handler,再注册关联它的HttpClient:

// 先注册自定义Handler
builder.Services.AddScoped<MyJWTHttpHandler>();

// 再注册带Handler的HttpClient
builder.Services.AddScoped(sp => 
    new HttpClient(sp.GetRequiredService<MyJWTHttpHandler>())
    {
        BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)
    });

如果你用的是AddHttpClient扩展方法,也要确保通过AddHttpMessageHandler把你的Handler关联进去:

builder.Services.AddHttpClient("AuthClient", client =>
{
    client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress);
})
.AddHttpMessageHandler<MyJWTHttpHandler>();

3. 确认首次请求用的是正确的HttpClient实例

有时候我们会在组件里直接new HttpClient(),或者注入了另一个没绑定Handler的HttpClient实例,这时候首次请求自然不会触发你的Handler。一定要确保所有需要带Token的请求,用的都是通过依赖注入获取的、绑定了MyJWTHttpHandler的那个HttpClient。

4. 排查首次请求的发起时机

如果你的首次请求是在OnInitializedAsync里发起的,这时候Blazor的SessionStorage或者服务注入可能还没完全初始化完成?你可以把请求移到OnAfterRenderAsync里,只在首次渲染时执行:

protected override async Task OnAfterRenderAsync(bool firstRender)
{
    if (firstRender)
    {
        // 这里发起你的首次请求
        await _authHttpClient.GetAsync("/api/your-endpoint");
        StateHasChanged();
    }
}

你可以先从检查base.SendAsync是否调用、服务注册顺序这两点入手,这俩是最常见的诱因。如果还是没解决,把Program.cs里的完整服务注册代码和首次请求的发起代码贴出来,我再帮你细查~

备注:内容来源于stack exchange,提问作者Hamza Modakir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 15:29:51