在 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的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET CORE 5.0 Identity 显示当前登录用户
无法在 ASP.NET Core 5.0 下的 IIS 中托管 CoreWcf
如何在 ASP.NET Core 5.0 中处理来自客户端的双重请求?
EF Core 5.0 - 更新 ASP.NET Core Web API 中的多对多实体