Man*_*rro 9 c# dotnet-httpclient .net-core httpclientfactory .net-core-2.1
我想为 Typed HttpClient 添加一个 HttClientHandler 以包含证书身份验证。
我在网上找到的所有例子都是这样的:
services.AddHttpClient<IMyService, MyService>()
.ConfigurePrimaryHttpMessageHandler(() =>
{
return new HttpClientHandler()
{
// Set here whatever you need to get configured
};
});
Run Code Online (Sandbox Code Playgroud)
但是我不想在此处包含获取证书的所有逻辑,因此我想使用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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
很重要!
另一方面,在尝试注册我的 http 客户端处理程序时,我注意到它从未被调用过。经过一番谷歌搜索后,我发现目前有一个关于此的公开错误(https://github.com/aspnet/Extensions/issues/851)。因此,在修复之前,您需要以这种方式配置处理程序:
services.AddTransient<MyHttpClientHandler>();
services.AddHttpClient<IMyService, MyService>()
.ConfigurePrimaryHttpMessageHandler(sp => sp.GetRequiredService<MyHttpClientHandler>());
Run Code Online (Sandbox Code Playgroud)
派生自HttpClientHandler或任何HttpMessageHandler派生类。
public class MyHttpClientHandler : HttpClientHandler {
public MyHttpClientHandler() {
//Set here whatever you need to get configured
}
//...override members as needed
}
Run Code Online (Sandbox Code Playgroud)
使用适当的扩展名调用您的处理程序
services
.AddHttpClient<IMyService, MyService>()
.ConfigurePrimaryHttpMessageHandler<MyHttpClientHandler>();
Run Code Online (Sandbox Code Playgroud)
该MyHttpClientHandler会从正在兴建处理器股份寿命范围的服务供应商来解决。
| 归档时间: |
|
| 查看次数: |
7701 次 |
| 最近记录: |