Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Flurl-将WebRequestHandler添加到FlurlClient_C#_Http_Authentication_X509certificate2_Flurl - Fatal编程技术网

C#Flurl-将WebRequestHandler添加到FlurlClient

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

我正在与一个需要基于证书的身份验证的API合作。从中我看到,向
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)的解决方案