首页 > 解决方案 > 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
    }

标签: c#asp.net-coredependency-injectiondotnet-httpclient.net-5

解决方案


删除这一行:services.AddTransient<ToornamentService>();

当您调用时AddHttpClient,它会为您注入服务作为瞬态。

所以你正在做的是注射两次。而且由于您的瞬态注入是最后一次注入,因此优先于AddHttpClient注入。


推荐阅读