在 Asp.Net Core 5.0 中注册 HttpClient 时注入 ILogger
Posted
技术标签:
【中文标题】在 Asp.Net Core 5.0 中注册 HttpClient 时注入 ILogger【英文标题】:Inject ILogger when registering HttpClient in Asp.Net Core 5.0 【发布时间】:2021-12-17 21:14:06 【问题描述】:在 Asp.Net Core 中注册自定义服务时,例如:
services.AddScoped<ISomeService, SomeService>();
然后,开箱即用,您可以从 SomeService 类的承包商处访问 Microsoft ILogger。
但是如果你注册一个自定义的HttpClient,比如:
services.AddHttpClient<ISomeHttpClient, SomeHttpClient>(client =>
client.BaseAddress = new Uri(Configuration["Url"]);
client.DefaultRequestHeaders.Add("Accept", "application/json");
);
然后,您无法从 SomeHttpClient 的构造函数访问 Microsoft ILogger。我得到了错误:
无法解析类型“Microsoft.Extensions.Logging.ILogger”的服务
我知道框架已经在为您记录 HttpRequest 活动。我想做的是记录每个请求的正文,以防 StatusCode 不成功。
任何想法如何实现这一目标?
【问题讨论】:
【参考方案1】:你可以使用ILogger<SomeHttpClient> logger
而不是直接使用ILogger
吗?
这是一些可以正常工作的代码。
public class GitHubService
private readonly HttpClient _client;
private readonly ILogger<GitHubService> _logger;
public GitHubService(HttpClient client, ILogger<GitHubService> logger)
client.BaseAddress = new Uri("https://api.github.com/");
// GitHub API versioning
client.DefaultRequestHeaders.Add("Accept",
"application/vnd.github.v3+json");
// GitHub requires a user-agent
client.DefaultRequestHeaders.Add("User-Agent",
"HttpClientFactory-Sample");
_client = client;
_logger = logger;
public async Task<IEnumerable<string>> GetAspNetDocsIssues()
_logger.LogInformation("Getting issues from GitHub");
return await _client.GetFromJsonAsync<IEnumerable<string>>(
"/repos/aspnet/AspNetCore.Docs/issues?state=open&sort=created&direction=desc");
源码:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-5.0
【讨论】:
我确实犯了一个错误,试图注入 ILogger 的非通用版本。另一种方法是创建一个自定义 DelegatingHandler 来封装日志记录责任。然后我们可以使用 services.AddTransient以上是关于在 Asp.Net Core 5.0 中注册 HttpClient 时注入 ILogger的主要内容,如果未能解决你的问题,请参考以下文章