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);
Другие вопросы по тегам