我正在使用httpClientFactory请求一个微信支付接口,但是微信支付接口需要一个证书。如何配置httpClientFactory以使用证书?
发布于 2019-02-06 14:58:23
首先,您需要注册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的证书。签名的是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的参数相同的名称签名的。
以后更新
如果您编写具有多个证书的HttpClient,则可以在每次需要时手动创建和配置SAAS。这是最简单的方法。
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
}
}
}发布于 2020-06-25 21:38:13
如果您查看DI中返回的默认工厂,它继承自两个接口,而在注入时,您选择只使用一个:
internal class DefaultHttpClientFactory : IHttpClientFactory, IHttpMessageHandlerFactory
了解了这一点,你可以采取一个偷偷摸摸的解决办法:
_handlerFactory = _clientFactory as IHttpMessageHandlerFactory;
现在看看处理程序工厂,它有一个与CreateClient方法具有相同字符串参数的CreateHandler方法。实际上,如果你看一下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;发布于 2020-08-27 12:57:10
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,
};
});https://stackoverflow.com/questions/54547937
复制相似问题