gpt4 book ai didi

C# Flurl - 将 WebRequestHandler 添加到 FlurlClient

转载 作者:可可西里 更新时间:2023-11-01 16:26:29 25 4
gpt4 key购买 nike

我正在使用 Flurl访问需要基于证书的身份验证的 API。我从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));

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

问题

使用 Flurl 支持客户端证书身份验证的最佳/正确方法是什么?

最佳答案

您很接近 - 定制工厂绝对是您的不二之选。但是您想覆盖 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);

关于C# Flurl - 将 WebRequestHandler 添加到 FlurlClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41033337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com