c# - 如何使用 ConfigurePrimaryHttpMessageHandler 泛型

标签 c# .net-core dotnet-httpclient .net-core-2.1 httpclientfactory

我想为 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 将从范围内的服务提供者解析,该服务提供者共享正在构建的处理程序的生命周期。

关于c# - 如何使用 ConfigurePrimaryHttpMessageHandler 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57875320/

相关文章:

c# - Blazor jquery select2 双向绑定(bind)

c# - HttpClient PostAsync 发布空内容

c# - 使用 ModelState 从 WebAPI 2 返回错误

c# - Visual Studio 2013 C# Designer 不允许我移动控件

c# - 执行 LambdaExpression 并获取返回值作为对象

c# - Nunit 测试命名约定示例

.net-core - Identity Server 4登录后重定向仅在Chrome中不起作用

c# - 在 Linux 上从 .NET Core 使用 NTLM 身份验证调用 WCF 服务

c# - Azure api 请求被中止 : Could not create SSL/TLS secure channel. http 客户端在调用某些 Web api 时

c# - FluentValidation 使用手动验证的隐式子验证