如何使用ConfigurePrimaryHttpMessageHandler通用方法

19

我想为一个类型化的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派生。 https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.httpclientbuilderextensions.configureprimaryhttpmessagehandler?view=aspnetcore-2.2#Microsoft_Extensions_DependencyInjection_HttpClientBuilderExtensions_ConfigurePrimaryHttpMessageHandler__1_Microsoft_Extensions_DependencyInjection_IHttpClientBuilder_ - Nkosi
我了解HttpClientHandler仅适用于.NET Framework和Core <= 2.0。请参阅文档。需要使用HttpMessageHandler - Peter L
1个回答

21

继承自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将从一个作用域服务提供程序中解析,该服务提供程序与正在构建的处理程序的生存期共享。


请参考我在原帖中添加的更新,因为目前使用通用版本配置主要 Http 消息处理程序存在错误。 - Manuel Navarro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接