C# Flurl - Добавить WebRequestHandler для FlurlClient
Я работаю с Flurl над API, который требует аутентификации на основе сертификатов. Я видел из этого поста, что добавление сертификата в 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));
Это кажется наиболее приемлемым вариантом, но я не уверен, так как делегат Action
без типа возврата.
Вопрос
Каков наилучший / правильный способ поддержки проверки подлинности сертификата на стороне клиента с помощью Flurl?
1 ответ
Вы близки - фабрика по индивидуальным заказам - определенно путь. Но вы хотите переопределить 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;
}
}
Затем вы можете зарегистрировать его глобально (при запуске приложения):
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);