3

我正在尝试在我的 ASP.NET 2.1 Web 应用程序中注册一个Typed HttpClient ,其中 Typed HttpClient 需要一个在构造函数中定义的 API 密钥。

例如

Startup.cs
----------
services.AddHttpClient<MyHttpClient>();


MyHttpClient.cs
---------------
public class MyHttpClient(string apiKey, HttpClient httpClient) { .. }

如您所见,我很确定 IoC/DI 不知道如何创建实例,MyHttpClient因为它不知道将什么值注入string apiKey参数。

这可能吗?

我还尝试参考有关“基础 - Http 请求(类型化客户端)”的 Microsoft 文档,但看不到任何示例。

4

2 回答 2

4

您可以在注册类型客户端时在 Startup 中配置您的 api 密钥

services.AddHttpClient<MyHttpClient>(c => 
{ 
    c.DefaultRequestHeaders.Add("Authorization", "{apikey}"); 
});
于 2018-06-08T07:07:08.767 回答
4

对于指定的客户,Brad 的回答可能是唯一的解决方案。但是对于键入的客户端,您可以按照 mjwills 的建议注入密钥。

在启动时:

services.AddSingleton<IApiKeyProvider, ApiKeyProvider>();

ApiKeyProvider 在哪里:

public class ApiKeyProvider: IApiKeyProvider
{
    public string ApiKey { get; set; }
}

并注入类型化的客户端:

public class MyHttpClient
{
    public HttpClient Client { get; }

    public MyHttpClient(HttpClient client, IApiKeyProvider apiKeyProvider)
    {
        var key = apiKeyProvider.ApiKey;
    }
}

或者当密钥存储在配置中时,您可以使用 IOptions。

在启动时:

services.Configure<ApiSettings>(options => configuration.GetSection("ApiSettings").Bind(options));

ApiSettings 在哪里:

public class ApiSettings
{
    public string ApiKey { get; set; }
}

并注入类型化的客户端:

public class MyHttpClient
{
    public HttpClient Client { get; }

    public MyHttpClient(HttpClient client, IOptions<ApiSettings> apiSettings)
    {
        var key = apiSettings.Value.ApiKey;
    }
}

以同样的方式,您可以访问请求上下文,例如当您想读取当前的 access_token 时,如我在此处的回答中所述。

于 2018-07-27T17:58:45.333 回答