c# - 配置 HttpClientFactory 时证书错误

标签 c# .net-core dotnet-httpclient httpclientfactory

我需要在 HttpClientFactory 中添加证书。使用 HttpClient 的旧实现如下所示:

var cookieContainer = new CookieContainer();
var handler = new HttpClientHandler { CookieContainer = cookieContainer };

var basePath = Directory.GetCurrentDirectory();
var certificatePath = Path.Combine(basePath, certPath);
var fileExists = File.Exists(certificatePath);

if (!fileExists)
    throw new ArgumentException(certificatePath);

var certificate = new X509Certificate2(certificatePath, certPwd);
handler.ClientCertificates.Add(certificate);

using (var client = new HttpClient(handler))
{
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(accept));
    client.DefaultRequestHeaders.Add("ApiKey", apiKey);

    var body = new { UserName = username, UserPassword = password };
    var jsonBody = JsonConvert.SerializeObject(body);
    var content = new StringContent(jsonBody, Encoding.UTF8, contentType);

    var loginResponse = client.PostAsync(loginEndpoint, content).Result;
 }

但是当我尝试从 ConfigurePrimaryHttpMessageHandler 获取连接时,我无法在处理程序中设置 ClientCertificates。如何解决这个问题?

更新

public void SetUpHttpClients(IServiceCollection services)
{
        var loginEndpoint = Path.Combine(baseApi, "api/authentication);
        var fileExists = File.Exists(certificatePath);

        if (!fileExists)
            throw new ArgumentException(certificatePath);

        var certificate = new X509Certificate2(certificatePath, certPwd);

        services.AddHttpClient("TestClient", client =>
        {
        client.BaseAddress = new Uri(baseApi);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(accept));
        client.DefaultRequestHeaders.Add("ApiKey", apiKey);

        var body = new { Username = username, Password = password };
        var jsonBody = JsonConvert.SerializeObject(body);
        var content = new StringContent(jsonBody, Encoding.UTF8, contentType);

        var loginResponse = client.PostAsync(loginEndpoint, content).Result;

        }).ConfigurePrimaryHttpMessageHandler(() =>
        {
            var cookieContainer = new CookieContainer();
            var handler = new HttpClientHandler
            {
                CookieContainer = cookieContainer
            };
            handler.ClientCertificates.Add(certificate);
            return handler;
}); 

最佳答案

异常消息是准确的。

调用 ClientCertificates.Add(certificate); 与之前的方式没有什么不同

services.AddHttpClient("TestClient", client => {
    client.BaseAddress = new Uri(baseApi);
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(accept));
    client.DefaultRequestHeaders.Add("ApiKey", apiKey);
})
.ConfigurePrimaryHttpMessageHandler(() => {
    var handler = new HttpClientHandler {
        CookieContainer = cookieContainer
    };
    handler.ClientCertificates.Add(certificate);
    return handler;
});

关于c# - 配置 HttpClientFactory 时证书错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50989872/

相关文章:

c# - 使用 Sitecore.FakeDb 的单元测试在 GetItem 上抛出 Sitecore.Nexus 实例化错误

c# - 无法 nunit 测试我的 log4net 包装类

macos - WebStatus 不会编译 : The "jquery@3.4.1" library could not be resolved by the "cdnjs" provider

c# - 模拟 HttpMessageHandler 时未调用 SendAsync

c# - A*寻路..保存路径

c# - 通过 SOAP 发送二进制流

.net - 如果系统日期设置为 future ,为什么请求在 wp8 上会失败?

c# - "clean"不记名 token 的更好方法

c# - 如何向服务器端 Blazor 项目添加 Controller (而非 View )支持

c# - 如何在 .NET Core 3.1.0 中使用 ACL 在 Mac OS 上管理文件夹权限