DelegateHandler 的 DI 无法正常工作

h0u*_*use 2 c# asp.net-core httpclientfactory

刚开始使用 HttpFactory,并且非常困惑它的 DI 是如何工作的,例如这条线的工作方式

services.AddHttpClient<IMyClient, MyClient>()
   .AddHttpMessageHandler(s => new UserAgentDelegatingHandler());
Run Code Online (Sandbox Code Playgroud)

这不

services.AddHttpClient<IMyClient, MyClient>()
  .AddHttpMessageHandler<UserAgentDelegatingHandler>();
Run Code Online (Sandbox Code Playgroud)

返回

“消息:System.InvalidOperationException:没有注册‘UserAgentDelegatingHandler’类型的服务。”

这里的情况相同,以下代码工作正常

services.AddHttpContextAccessor();
services.AddHttpClient<IMyClient, MyClient>()
   .AddHttpMessageHandler(s => new CookieDelegateHandler(s.GetRequiredService<IHttpContextAccessor>()));
Run Code Online (Sandbox Code Playgroud)

但这并没有

services.AddHttpContextAccessor();
services.AddHttpClient<IMyClient, MyClient>()
   .AddHttpMessageHandler<CookieDelegateHandler>();
Run Code Online (Sandbox Code Playgroud)

我从这些示例中阅读了很多 HttpClientFactory 用法示例,以及我的 DelegateHandlers。

我做错了什么?

Tao*_*hou 7

返回“消息:System.InvalidOperationException:没有注册‘UserAgentDelegatingHandler’类型的服务。”

正如此错误所示,您需要UserAgentDelegatingHandler在使用.AddHttpMessageHandler<UserAgentDelegatingHandler>().

检查AddHttpMessageHandler,你会发现

DelegatingHandler 的类型。处理程序类型必须注册为瞬态服务。

尝试更改您的代码,例如

services.AddTransient<UserAgentDelegatingHandler>();
services.AddHttpClient<IMyClient, MyClient>()
        .AddHttpMessageHandler<UserAgentDelegatingHandler>();
Run Code Online (Sandbox Code Playgroud)

  • 如果我这样做,我会在尝试激活“MyDelegatingHandler”时收到“无法解析类型“System.Net.Http.HttpMessageHandler”的服务” (2认同)