为何注入的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
相关产品推荐
相关产品推荐

