如何使用httpclientfactory配置证书

时间:2019-02-06 06:37:54

标签: asp.net-core

我正在使用HttpclientFactory要求微信支付Api。但是微信支付了Api Need证书。如何配置HttpClintFactory以使用证书?

3 个答案:

答案 0 :(得分:2)

如果您查看DI中返回的Default工厂,则它继承自两个接口,并且在注入时选择仅使用一个:

internal class DefaultHttpClientFactory : IHttpClientFactory, IHttpMessageHandlerFactory

知道这一点后,您可以采取一个偷偷摸摸的解决方法:

_handlerFactory = _clientFactory as IHttpMessageHandlerFactory;

现在,如果您查看处理程序工厂,它有一个方法CreateHandler,它的字符串参数与CreateClient方法相同。实际上,如果您查看CreateClient的实现,则可以看到它使用此方法缓存了处理程序。

让您省去启动:将您的客户端工厂转换为处理程序工厂,为您的特定用户创建处理程序,验证处理程序上的所有属性(例如那里的证书,或者由于它是新实例而需要添加它),然后照常致电CreateClient

编辑:在启动时,您可能仍然需要添加ConfigurePrimaryHttpMessageHandler来实际创建HttpClientHandler,因此您可能不得不进行一次注册,即只注册一个名为HttpClient的证书,而只是交换证书。不过,它仍然为您提供了拥有工厂的优势。

编辑2:知道处理程序在装饰器中包装了很多次,因此您需要深入研究。我使用的技巧是:

var handler = _handlerFactory.CreateHandler("customer");
while (handler as DelegatingHandler != null)
{
   handler = (handler as DelegatingHandler).InnerHandler;
}
var clientHandler = handler as HttpClientHandler;

答案 1 :(得分:0)

首先,您需要注册HttpClient

services.AddHttpClient("signed")
        .ConfigurePrimaryMessageHandler(() =>
        {
            var handler = new HttpClientHandler();
            var certificate = new X509Certificate2(filename: "foo.pfx", password: "123");

            handler.ClientCertificateOptions = ClientCertificateOptions.Manual;
            handler.ClientCertificates.Add(certificat);
        });

在示例中,文件 foo.pfx 包含一个密码为 123 的证书。 ** signed *是HttpClient的名称。

第二,您将调用IHttpClientFactory.CreateClient创建HttpClient实例。

public class PayClient
{
    private readonly IHttpClientFactory _httpClientFactory;

    public PayClient(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    public async Task SomePayMethodAsync()
    {
        using (httpClient = _httpClientFactory.CreateClient("signed"))
        {
            // use httpClient
        }
    }
}

您需要使用与CreateClient相同的名称 signed

最新更新

如果使用许多证书编写SAAS,则可以在每次需要时手动创建和配置HttpClient。这是最简单的方法。

public class PayClient
{
    private readonly ICurrentUserProvider _currentUserProvider;

    public PayClient(ICurrentUserProvider _currentUserProvider)
    {
        _currentUserProvider = currentUserProvider;
    }

    private HttpClient CreateHttpClient()
    {
        var currentUser = _currentUserProvider.CurrentUser;
        var filename = currentUser.CertificateFilename;
        var password = currentUser.CertificatePassword;
        var handler = new HttpClientHandler();
        var certificate = new X509Certificate2(filename, password);

        handler.ClientCertificateOptions = ClientCertificateOptions.Manual;
        handler.ClientCertificates.Add(certificat);

        return new HttpClient(handler);
    }

    public async Task SomePayMethodAsync()
    {
        using (httpClient = CreateHttpClient())
        {
            // use httpClient
        }
    }
}

答案 2 :(得分:-1)

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1

services.AddHttpClient("configured-disable-automatic-cookies")
    .ConfigurePrimaryHttpMessageHandler(() =>
    {
        return new SocketsHttpHandler()
        {
            UseCookies = false,
        };
    });