首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用httpClientFactory配置证书

如何使用httpClientFactory配置证书
EN

Stack Overflow用户
提问于 2019-02-06 14:37:54
回答 3查看 4.2K关注 0票数 3

我正在使用httpClientFactory请求一个微信支付接口,但是微信支付接口需要一个证书。如何配置httpClientFactory以使用证书?

EN

回答 3

Stack Overflow用户

发布于 2019-02-06 14:58:23

首先,您需要注册HttpClient

代码语言:javascript
复制
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的证书。签名的HttpClient的名称。

其次,您将调用IHttpClientFactory.CreateClient来创建HttpClient实例。

代码语言:javascript
复制
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的参数相同的名称签名的

以后更新

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

代码语言:javascript
复制
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
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2020-06-25 21:38:13

如果您查看DI中返回的默认工厂,它继承自两个接口,而在注入时,您选择只使用一个:

internal class DefaultHttpClientFactory : IHttpClientFactory, IHttpMessageHandlerFactory

了解了这一点,你可以采取一个偷偷摸摸的解决办法:

_handlerFactory = _clientFactory as IHttpMessageHandlerFactory;

现在看看处理程序工厂,它有一个与CreateClient方法具有相同字符串参数的CreateHandler方法。实际上,如果你看一下CreateClient的实现,你会发现它使用了这个方法,然后缓存处理程序。

因此,忘记启动:将您的客户端工厂转换为处理程序工厂,为您的特定用户创建一个处理程序,验证处理程序上的所有属性(比如证书是否存在,或者您是否需要添加它,因为它是一个新实例),然后像往常一样调用CreateClient

编辑:在启动时,你可能仍然需要添加ConfigurePrimaryHttpMessageHandler来实际创建一个HttpClientHandler,所以你可能不得不同意只注册一个名为HttpClient的证书,并且只交换证书。尽管如此,它仍然为您提供了拥有工厂的优势。

编辑2:知道处理程序在装饰器中被包装了很多次,所以你需要深入挖掘。我使用的技巧是:

代码语言:javascript
复制
var handler = _handlerFactory.CreateHandler("customer");
while (handler as DelegatingHandler != null)
{
   handler = (handler as DelegatingHandler).InnerHandler;
}
var clientHandler = handler as HttpClientHandler;
票数 2
EN

Stack Overflow用户

发布于 2020-08-27 12:57:10

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

代码语言:javascript
复制
services.AddHttpClient("configured-disable-automatic-cookies")
    .ConfigurePrimaryHttpMessageHandler(() =>
    {
        return new SocketsHttpHandler()
        {
            UseCookies = false,
        };
    });
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54547937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档