官方给的示例 IHttpClientFactory 如果需要配置文件都是在 services.AddHttpClient()这里配置
var clientCertificate =
new X509Certificate2(
Path.Combine(_environment.ContentRootPath, "sts_dev_cert.pfx"), "1234");
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(clientCertificate);
services.AddHttpClient("namedClient", c =>
{
}).ConfigurePrimaryHttpMessageHandler(() => handler);
想问一下 有办法不在这里添加证书,在请求的时候 动态添加证书吗,比如 我有多个证书,我需要在请求A连接需要A证书 在请求B链接使用B证书。这样应该怎么操作啊?大佬们求救
方法一: 推荐的做法是这样子
services.AddHttpClient("a业务").ConfigurePrimaryHttpMessageHandler(...a业务证书)
services.AddHttpClient("b业务").ConfigurePrimaryHttpMessageHandler(...b业务证书)
ServiceProvider.GetService<IHttpClientFactory>().CreateClient("a业务")....
方法二:
如果你要完全自定义则可以用 new System.Net.Http.HttpClient(handler)
方法三:
在或者用骚操作, 替换配置的方式也可以 逻辑就是实现一个自己的HttpClientFactoryOptions, 然后动态生成它.
get_cert_handler_by_name 是你自己的方法,可以根据任何是否使用区别业务名称a,b,c new 一个handler.
但是要注意, 这样子所有从ServiceProvider获取HttpClient都会走到这个自定义配置类上面, 要做好兼容性.
class MyClass : IPostConfigureOptions<HttpClientFactoryOptions>
{
public void PostConfigure(string name, HttpClientFactoryOptions options)
=> options.HttpMessageHandlerBuilderActions.Add(p => p.PrimaryHandler = get_cert_handler_by_name(name));
}
//注册这个服务
services.AddSingleton<Microsoft.Extensions.Options.IPostConfigureOptions<Microsoft.Extensions.Http.HttpClientFactoryOptions>, MyClass>();
这第三个办法可太骚了。学习大佬
那就注入2个HttpClient,分别添加不同的证书。