c# - 如何使用 ConfigurePrimaryHttpMessageHandler 泛型
问题描述
我想为 Typed HttpClient 添加一个 HttClientHandler 以包含证书身份验证。
我在互联网上找到的所有示例都是这样的:
services.AddHttpClient<IMyService, MyService>()
.ConfigurePrimaryHttpMessageHandler(() =>
{
return new HttpClientHandler()
{
// Set here whatever you need to get configured
};
});
但是我不想在此处包含获取证书的所有逻辑,因此我想使用ConfigurePrimaryHttpMessageHandler<>的通用版本并编写自己的消息处理程序以将证书包含在请求中。
问题是我很难理解我应该如何实现消息处理程序......我应该从HttpClientHandler继承吗?
请帮忙!
更新
正如我最初怀疑和@Nkosi 确认的那样,从 HttpClient 处理程序派生是在这种情况下要走的路。末尾的代码与此类似:
public class MyHttpClientHandler : HttpClientHandler
{
private readonly IMyConfiguration _myConfiguration;
public MyHttpClientHandler(IMyConfiguration myConfiguration)
{
_myConfiguration = myConfiguration;
using (var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine))
{
certStore.Open(OpenFlags.ReadOnly);
var certCollection = certStore.Certificates.Find(
X509FindType.FindBySerialNumber,
_myConfiguration.MyCertificateSerial,
true);
X509Certificate2 certificate = certCollection[0];
ClientCertificateOptions = ClientCertificateOption.Manual;
SslProtocols = System.Security.Authentication.SslProtocols.Tls12;
ClientCertificates.Add(certificate);
}
}
}
很重要!
另一方面,在尝试注册我的 http 客户端处理程序时,我注意到它从未被调用过。经过一番谷歌搜索后,我发现目前有一个关于此的开放错误(https://github.com/aspnet/Extensions/issues/851)。因此,在它得到修复之前,您需要以这种方式配置您的处理程序:
services.AddTransient<MyHttpClientHandler>();
services.AddHttpClient<IMyService, MyService>()
.ConfigurePrimaryHttpMessageHandler(sp => sp.GetRequiredService<MyHttpClientHandler>());
解决方案
派生自HttpClientHandler
或任何HttpMessageHandler
派生类。
public class MyHttpClientHandler : HttpClientHandler {
public MyHttpClientHandler() {
//Set here whatever you need to get configured
}
//...override members as needed
}
使用适当的扩展名调用您的处理程序
services
.AddHttpClient<IMyService, MyService>()
.ConfigurePrimaryHttpMessageHandler<MyHttpClientHandler>();
MyHttpClientHandler
将从共享正在构建的处理程序的生命周期的范围服务提供程序中解析。
推荐阅读
- twitter-bootstrap - 如何在引导程序的右侧添加 EMPTY col
- mysql - 你如何确定 PHP 中两个常量值之间的百分比?
- node.js - 使用 stripe + netlify 时如何将订单确认数据反映到前端?
- python - 将长字符串写入文件
- trim - 在多路分解、适配器移除、修剪和过滤之后,有多少 GBS 衍生读数通过过滤器?
- python - 你如何在 UnitTest 中测试列表?
- docker-compose - 无法在 docker 中运行 .net 核心应用 Azure Durable Functions v3
- javascript - 为什么我只返回一个过滤的对象而不是全部?
- java - 如何在 Java 中添加未知字段“21”的 FieldMask
- flutter - 如何在 TextFormfeild Flutter 2.0.1 中关闭键盘