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

为何注入的LoggingDelegatingHandler未触发SendAsync方法?

问题原因及解决方案

1. 未注册自定义Handler到DI容器

AddHttpMessageHandler<LoggingDelegatingHandler>()要求目标Handler类型已在依赖注入容器中注册(如Transient)。如果未注册,框架无法实例化该Handler,自然不会将其加入请求管道,导致SendAsync方法不会被触发。

2. Handler添加顺序错误

当前代码中AddHttpMessageHandler在ConfigurePrimaryHttpMessageHandler之后调用,导致自定义日志Handler的层级位置不符合预期。HttpClient的请求管道遵循外层Handler先处理请求的规则,最后才到最底层的主处理器,错误的顺序会让日志Handler无法接收到请求。


修复步骤

第一步:注册LoggingDelegatingHandler到DI

在ConfigureServices方法中添加:

services.AddTransient<LoggingDelegatingHandler>();

第二步:调整HttpClient配置顺序

将AddHttpMessageHandler移到ConfigurePrimaryHttpMessageHandler之前,同时确保Polly重试策略在日志Handler之后(这样重试的请求也会被日志记录):

services.AddHttpClient(nameof(MyAuthorityClient),
        c => { c.BaseAddress = new Uri(myOptions.BaseUri); })
    .AddHttpMessageHandler<LoggingDelegatingHandler>() // 请求先经过日志Handler
    .AddTransientHttpErrorPolicy(x =>
        x.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(retryAttempt))) // 再经过重试策略
    .ConfigurePrimaryHttpMessageHandler<MyClientHttpHandler>(); // 最后到主处理器

额外验证

  • 检查MyClientHttpHandler是否正确继承自HttpClientHandler,且未在内部拦截请求导致日志Handler无法执行。
  • 可以在LoggingDelegatingHandler的构造函数中添加断点,确认该类是否被实例化,若未实例化则说明DI注册仍有问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:57:20