在 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&lt;SomeHttpClient&gt; 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() 和 .AddHttpMessageHandler() 注册处理程序

以上是关于在 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 中的多对多实体

ASP.NET Core 5.0 WebAPI 中的多种身份验证方案

从 foreach 循环 ASP.NET Core 5.0 返回一个变量