如何使用 ConfigurePrimaryHttpMessageHandler 泛型
How to use ConfigurePrimaryHttpMessageHandler generic
我想为 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
派生的 class。
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
将从共享正在构建的处理程序的生命周期的作用域服务提供者解析。
我想为 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
派生的 class。
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
将从共享正在构建的处理程序的生命周期的作用域服务提供者解析。