我正在使用HttpclientFactory
要求微信支付Api。但是微信支付了Api Need证书。如何配置HttpClintFactory以使用证书?
答案 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,
};
});