如何明确传递HttpClientHandler给HttpClientFactory?

5

我考虑使用HttpClientFactory,但我需要在发出请求时附加证书,目前我正在使用HttpClient,但不知道如何附加证书。
以下是httpClient的代码:

HttpClientHandler httpClientHandler = new HttpClientHandler
{
    SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12,
    ClientCertificateOptions = ClientCertificateOption.Manual
};
httpClientHandler.ClientCertificates.Add(CertHelper.GetCertFromStoreByThumbPrint(_Settings.MtlsThumbPrint, StoreName.My, _Settings.IgnoreCertValidChecking));

httpClientHandler.ServerCertificateCustomValidationCallback = OnServerCertificateValidation;

HttpClient _client = new HttpClient(httpClientHandler)
{
    Timeout = TimeSpan.FromMinutes(1),
    BaseAddress = new Uri(_Settings.BaseUrl)
};

那么,如何将上述httpClient转换为HttpClientFactory?

任何帮助都将不胜感激。

2个回答

7
假设您的意思是使用 ServiceCollection,您可以在设置客户端时配置处理程序。
services.AddHttpClient("MyClient", client => {
    client.Timeout = TimeSpan.FromMinutes(1),
    client.BaseAddress = new Uri(_Settings.BaseUrl)
})
.ConfigurePrimaryHttpMessageHandler(() => {
    var httpClientHandler = new HttpClientHandler
    {
        SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12,
        ClientCertificateOptions = ClientCertificateOption.Manual
    };
    httpClientHandler.ClientCertificates.Add(CertHelper.GetCertFromStoreByThumbPrint(_Settings.MtlsThumbPrint, StoreName.My, _Settings.IgnoreCertValidChecking));

    httpClientHandler.ServerCertificateCustomValidationCallback = OnServerCertificateValidation;

    return httpClientHandler;
});

这样,当IHttpClientFactory被注入并调用客户端时。

var _client = httpClientFactory.CreateClient("MyClient");

创建的客户端将已经配置好所需的证书。

嗨@Nkosi,感谢您的回答。但是我的问题是关于显式添加证书的。但是您的代码似乎是在启动时添加的。但我需要在Post请求期间添加。 - BV Winoya
1
@BVWinoya “但我需要仅在Post请求期间添加”。这不能使用工厂完成。 - Nkosi

0

我发现这对我有用。证书凭据来自appsettings.json

var certPath = builder.Configuration["CertPath"];
var certKey = builder.Configuration["CertificateKey"];
var targetUrl = builder.Configuration["TargetUrl"];
builder.Services.AddHttpClient("MyClient", client => {
    client.Timeout = TimeSpan.FromMinutes(1);
    client.BaseAddress = new Uri(targetUrl);
})
.ConfigurePrimaryHttpMessageHandler(() => {
    var httpClientHandler = new HttpClientHandler
    {
        SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13,
    };
    httpClientHandler.ClientCertificates.Add(new X509Certificate2(certPath, certKey));
        
    return httpClientHandler;
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接