C#Flurl-将WebRequestHandler添加到FlurlClient
我正在与一个需要基于证书的身份验证的API合作。从中我看到,向C#Flurl-将WebRequestHandler添加到FlurlClient,c#,http,authentication,x509certificate2,flurl,C#,Http,Authentication,X509certificate2,Flurl,我正在与一个需要基于证书的身份验证的API合作。从中我看到,向WebRequestHandler添加证书并指示HttpClient使用该处理程序很容易 然而,使用Flurl对我来说不是很清楚。我试过以下三件事 扩展DefaultHttpFactory WebRequestHandler handler = new WebRequestHandler(); handler.ClientCertificates.Add(myX509Cert); var clientFactory = new Def
WebRequestHandler
添加证书并指示HttpClient
使用该处理程序很容易
然而,使用Flurl对我来说不是很清楚。我试过以下三件事
扩展DefaultHttpFactory
WebRequestHandler handler = new WebRequestHandler();
handler.ClientCertificates.Add(myX509Cert);
var clientFactory = new DefaultHttpClientFactory();
FlurlClient fc = clientFactory.CreateClient(url, handler);
我首先怀疑我需要创建自己的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));
这似乎是最可行的选择,但我不确定,因为委托是一个操作
,没有返回类型
问题
使用Flurl支持客户端证书身份验证的最佳/正确方法是什么?你已经接近成功了-定制工厂无疑是一条出路。但是您希望覆盖
CreateMessageHandler
,而不是CreateClient
:
public class X509HttpFactory : DefaultHttpClientFactory
{
private readonly X509Certificate2 _cert;
public X509HttpFactory(X509Certificate2 cert) {
_cert = cert;
}
public override HttpMessageHandler CreateMessageHandler() {
var handler = new WebRequestHandler();
handler.ClientCertificates.Add(_cert);
return handler;
}
}
var cli = new FlurlClient(url)
.Configure(settings => settings.HttpClientFactory = new X509HttpFactory(myCert));
然后,您可以全局注册它(在应用程序启动时):
或对特定主机的所有呼叫:
FlurlHttp.ConfigureClient(ROOT_URL, cli => {
cli.Settings.HttpClientFactory = new X509HttpFactory(myCert);
});
或对于新的FlurlClient
:
public class X509HttpFactory : DefaultHttpClientFactory
{
private readonly X509Certificate2 _cert;
public X509HttpFactory(X509Certificate2 cert) {
_cert = cert;
}
public override HttpMessageHandler CreateMessageHandler() {
var handler = new WebRequestHandler();
handler.ClientCertificates.Add(_cert);
return handler;
}
}
var cli = new FlurlClient(url)
.Configure(settings => settings.HttpClientFactory = new X509HttpFactory(myCert));
或现有的:
cli.Settings.HttpClientFactory = new X509HttpFactory(myCert);
谢谢很棒的图书馆!如果我有多个URL,配置是什么?例如,我将其应用于登录到系统后访问的web爬虫,它重定向到另一个地址,如(1)或(2),我在这两个域上都做了,如何配置baseAddress域(1)和(2)未知,具体取决于它们的服务器navigation@mincasoft我想我展示的第一种方法是如何注册(全球)就是这样。我没有得到添加webRequestHandler的参考,应该怎么做?看起来webRequestHandler在.net Framework中可用,任何针对.net核心(.net 5)的解决方案