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);
我正在与 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);