2016-12-08 3 views
2

私はFlurlと協力して、証明書ベースの認証を必要とするAPIにヒットします。 this SO postから、WebRequestHandlerに証明書を追加し、HttpClientにこのハンドラを使用するよう指示することは簡単です。C#Flurl - FlurlClientにWebRequestHandlerを追加します。

しかし、Flurlを使用して私にとってはあまり明確ではありません。私は以下の3つのことを試しました。私が最初に私がハンドラを作成し、それがHttpClientに割り当てますX509HttpFactory : DefaultHttpFactory自分自身を作成するために必要なことを疑わDefaultHttpFactory

を拡張

。しかし、ソースを見ると、CreateClientのコンストラクタにはすでにハンドラが必要であることがわかります。このハンドラはどこから来たのですか?これはHttpClientとしてコンパイルされませんDefaultHttpFactory

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

を使用してクライアントの作成

は、これが最も現実的な選択肢のように思えるFlurlClient

使用ConfigureHttpClient

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

をキャストすることはできません、bu代理人が戻り値のない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)); 

または既存の1:

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

感謝。素晴らしいライブラリ! –

関連する問題