C# Flurl - 将 WebRequestHandler 添加到 FlurlClient

C# Flurl - Add WebRequestHandler to FlurlClient

我正在与 Flurl to hit an API that requires certificate-based authentication. I have seen from this SO post 合作,将证书添加到 WebRequestHandler 并指示 HttpClient 使用此处理程序很容易。

但是,我使用Flurl 不是很清楚。我已经尝试了以下三件事。

扩展 DefaultHttpFactory

我首先怀疑我需要创建自己的 X509HttpFactory : DefaultHttpFactory,这将创建处理程序并将其分配给 HttpClient。但是,在查看源代码时,我注意到 CreateClient 的构造函数已经需要一个处理程序。这个处理程序来自哪里?

使用 DefaultHttpFactory 创建客户端

WebRequestHandler handler = new WebRequestHandler();
handler.ClientCertificates.Add(myX509Cert);
var clientFactory = new DefaultHttpClientFactory();
FlurlClient fc = clientFactory.CreateClient(url, handler);

这无法编译,因为 HttpClient 无法转换为 FlurlClient

使用 ConfigureHttpClient

var clientFactory = new DefaultHttpClientFactory();
FlurlClient fc = new Url("foobar.com").ConfigureHttpClient(client => client = clientFactory
  .CreateClient(url, handler));

这似乎是最可行的选择,但我不确定,因为委托是一个没有 return 类型的 Action

问题

使用 Flurl 支持客户端证书身份验证的 best/correct 方法是什么?

您很接近 - 定制工厂绝对是您的不二之选。但是您想覆盖 CreateMessageHandler 而不是 CreateClient:

public class X509HttpFactory : DefaultHttpClientFactory
{
    private readonly X509Certificate2 _cert;

    public X509HttpFactory(X509Certificate2 cert) {
        _cert = cert;
    }

    public override HttpMessageHandler CreateMessageHandler() {
        var handler = base.CreateMessageHandler();
        handler.ClientCertificates.Add(_cert);
        return handler;
    }
}

然后您可以全局注册它(在应用程序启动时):

FlurlHttp.Configure(settings => {
    settings.HttpClientFactory = new X509HttpFactory(myCert);
});

或对特定主机的所有调用:

FlurlHttp.ConfigureClient(ROOT_URL, cli => {
    cli.Settings.HttpClientFactory = new X509HttpFactory(myCert);
});

或新 FlurlClient:

var cli = new FlurlClient(url)
    .Configure(settings => settings.HttpClientFactory = new X509HttpFactory(myCert));

或现有的:

cli.Settings.HttpClientFactory = new X509HttpFactory(myCert);