从配置文件配置 HttpClient/HttpMessageHandler

Configuring HttpClient/HttpMessageHandler from config file

我的 appsettings.json 文件包含以下部分。

"TrackAndTrace": {
  "DebugBaseUrl": "https://localhost:44360/api",
  "BaseUrl": "https://example.com/api",
  "Username": "Username",
  "Password": "Password",
  "CompanyCode": "CODE"
},

然后我按如下方式配置 HttpClient

services.AddHttpClient<TestApi>()
    .ConfigurePrimaryHttpMessageHandler(() =>
    {
        return new HttpClientHandler()
        {
           // I want to incorporate this somehow:
           // services.Configure<TrackAndTraceSettings>(Configuration.GetSection("TrackAndTrace"))
           Credentials = new NetworkCredential(????, ???),
        };
    });

我的问题是:如何从此处的配置文件中获取用户名密码,并将其分配给HttpClientHandler.Credentials?

理想情况下,它可以以一种高效的方式完成,这样它只需要从设置文件中读取一次。

使用 overload for ConfigurePrimaryHttpMessageHandler that accepts a callback with IServiceProvider parameter.

// assuming you've set up the configuration in ConfigureServices method:
// services.Configure<TrackAndTraceSettings>(Configuration.GetSection("TrackAndTrace"))

services.AddHttpClient<TestApi>()
    .ConfigurePrimaryHttpMessageHandler((serviceProvider) =>
    {
        var config = serviceProvider.GetRequiredService<IOptions<TrackAndTraceSettings>>().Value;
        return new HttpClientHandler()
        {
           Credentials = new NetworkCredential(config.Username, config.Password),
        };
    });

您可以使用

var credentials = Configuration.GetSection("TrackAndTrace").Get<TrackAndTrace>();

TrackAndTrace模型应该是这样的;

public class TrackAndTrace{
    public string DebugBaseUrl {get;set;}
    public string BaseUrl {get;set;}
    public string Username {get;set;}
    public string Password {get;set;}
    public string CompanyCode {get;set;}
}

然后您必须配置服务;

var credentials = Configuration.GetSection("TrackAndTrace").Get<TrackAndTrace>();
services.AddHttpClient<TestApi>()
    .ConfigurePrimaryHttpMessageHandler(() =>
    {
        return new HttpClientHandler()
        {
           Credentials = new NetworkCredential(credentials.Username, credentials.Password),
        };
    });