c# - HttpClient 属性未通过 DI 传递
问题描述
我正在开发一个 ASP.NET Core 5.0 项目,该项目具有访问 API 的服务。根据下面的代码,我希望提供给 ToornamentService 的构造函数的 HttpClient 包含声明的 BaseAddress 和 API 密钥头。
但是,在调试时,我注意到 HttpClient 从来没有这些。BaseAdress 为空,并且缺少标头。我尝试使用 IHttpClientFactory 而不是类型化的客户端,但最终得到了相同的结果。
我究竟做错了什么?
配置服务方法:
public void ConfigureServices(IServiceCollection services)
{
//Omitted for brevity
services.AddHttpClient<ToornamentService>(c =>
{
c.BaseAddress = new Uri("https://api.toornament.com/");
c.DefaultRequestHeaders.Add("X-Api-Key", Configuration["Toornament:ApiKey"]);
});
services.AddTransient<ToornamentService>();
}
ToornamentService 类:
public ToornamentService(HttpClient client)
{
Client = client; // client.BaseAddress here is null
}
解决方案
删除这一行:services.AddTransient<ToornamentService>();
当您调用时AddHttpClient
,它会为您注入服务作为瞬态。
所以你正在做的是注射两次。而且由于您的瞬态注入是最后一次注入,因此优先于AddHttpClient
注入。
推荐阅读
- c# - Alglib 卡方分布示例
- javascript - 为什么我确实有以下类型错误:无法读取未定义的属性“长度”?(在反应中)
- android - 记住 LazyColumn 滚动位置 - Jetpack Compose
- webrtc - 特定对等方的 STUN 绑定(ICE 连接检查)失败
- neovim - 如何更改 coc.nvim 中 pylint 的路径?
- javascript - 尝试在 React Native 中更新数组对象
- ssis - 如果进程今天已经运行,如何禁用任务
- php - 以下代码未达到 else 语句
- java - 如何使用 jsoup 从网站获取视频或音频的 URL
- lua - 如何在 theme.lua/rc.lua (AwesomeWM) 中禁用窗口边框