2016-12-08 2 views
2

Je travaille avec Flurl pour lancer une API qui nécessite une authentification basée sur des certificats. J'ai vu de this SO post que l'ajout d'un certificat à un WebRequestHandler et l'instruction d'un HttpClient pour utiliser ce gestionnaire est facile.C# Flurl - Ajouter WebRequestHandler à FlurlClient

Cependant, il n'est pas si clair pour moi d'utiliser Flurl. J'ai essayé les trois choses suivantes.

Extension DefaultHttpFactory

je doutais d'abord que je devais créer mon propre X509HttpFactory : DefaultHttpFactory qui créerait le gestionnaire et l'affecter à la HttpClient. Cependant, en regardant la source, je remarque que le constructeur pour CreateClient attend déjà un gestionnaire. D'où vient ce gestionnaire?

Création client à l'aide DefaultHttpFactory

WebRequestHandler handler = new WebRequestHandler(); 
handler.ClientCertificates.Add(myX509Cert); 
var clientFactory = new DefaultHttpClientFactory(); 
FlurlClient fc = clientFactory.CreateClient(url, handler); 

Cela ne compile pas comme HttpClient ne peut pas être casté à FlurlClient

Utilisez ConfigureHttpClient

var clientFactory = new DefaultHttpClientFactory(); 
FlurlClient fc = new Url("foobar.com").ConfigureHttpClient(client => client = clientFactory 
    .CreateClient(url, handler)); 

Cela semble être l'option la plus viable , bu t Je ne suis pas sûr car le délégué est un Action sans type de retour.

La question

Quelle est la meilleure/bonne façon de soutenir l'authentification par certificat côté client à l'aide Flurl?

Répondre

1

Vous êtes proche - une usine personnalisée est définitivement la solution. Mais vous voulez remplacer CreateMessageHandler plutôt que 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; 
    } 
} 

Ensuite, vous pouvez enregistrer globalement (au démarrage de l'application):

FlurlHttp.Configure(settings => { 
    settings.HttpClientFactory = new X509HttpFactory(myCert); 
}); 

Ou pour tous les appels à un hôte particulier:

FlurlHttp.ConfigureClient(ROOT_URL, cli => { 
    cli.Settings.HttpClientFactory = new X509HttpFactory(myCert); 
}); 
Pour une nouvelle

Ou un existant:

cli.Settings.HttpClientFactory = new X509HttpFactory(myCert); 
+1

Merci. Super bibliothèque! –