2016-12-08 15 views
2

Я работаю с Flurl, чтобы попасть в API, требующий аутентификации на основе сертификатов. Я видел от this SO post, что добавление сертификата в WebRequestHandler и указание HttpClient использовать этот обработчик легко.C# Flurl - Добавить WebRequestHandler в FlurlClient

Однако для меня это не так понятно, используя 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)); 

Это кажется наиболее приемлемым вариантом , bu t Я не уверен, поскольку делегат является 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); 
+1

Спасибо. Удивительная библиотека! –