首页 新闻 搜索 专区 学院

如何使用IHttpClientFactory动态添加cer证书

0
悬赏园豆:200 [已解决问题] 解决于 2021-06-12 07:57

官方给的示例 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证书。这样应该怎么操作啊?大佬们求救

odinsam的主页 odinsam | 初学一级 | 园豆:24
提问于:2021-06-10 22:57
< >
分享
最佳答案
1

方法一: 推荐的做法是这样子
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>();
收获园豆:200
czd890 | 专家六级 |园豆:11904 | 2021-06-11 15:29

这第三个办法可太骚了。学习大佬

odinsam | 园豆:24 (初学一级) | 2021-06-12 07:56
其他回答(1)
0

那就注入2个HttpClient,分别添加不同的证书。

gt1987 | 园豆:1095 (小虾三级) | 2021-06-11 11:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册