web-dev-qa-db-ja.com

HttpClientFactoryを介して直接作成されたHttpClientのWebプロキシを構成する方法

  • Asp.Net Core IoC/DIヘルパーなしで直接意味します。

それに関するドキュメントは見つかりませんでした。ハンドラのライフサイクルがHttpClientFactoryによって管理されていないため、現在のソリューションは最適ではないと思います。

var proxiedHttpClientHandler = new HttpClientHandler() { Proxy = httpProxy };
_createHttpClient = () => HttpClientFactory.Create(proxiedHttpClientHandler);

より良い解決策はありますか?

5

クライアントをサービスコレクションに追加すると、そこでハンドラーを構成できるはずです。

名前付きクライアントのアプローチを使用して、定数を使用してクライアント名を保持します。

public static class NamedHttpClients {
    public const string ProxiedClient = "ProxiedClient";
}

そこからは、クライアントを構成するだけです

//...
var serviceCollection = new ServiceCollection();

serviceCollection
    .AddHttpClient(NamedHttpClients.ProxiedClient)
    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() { 
        Proxy = httpProxy 
    });

var services = serviceCollection.BuildServiceProvider();

そのため、解決されたIHttpClientFactoryを介してクライアントを呼び出すとき

var httpClientFactory = services.GetService<IHttpClientFactory>();

var client = httpClientFactory.CreateClient(NamedHttpClients.ProxiedClient);

返されたクライアントは、プロキシでハンドラを使用します。

3
Nkosi

あなたはこのようなことをすることができます:

private HttpClient ClientFactory()
{
    var proxiedHttpClientHandler = new HttpClientHandler(){ UseProxy = true};
    proxiedHttpClientHandler.Proxy = new WebProxy("proxy address");
    var httpClient = new HttpClient(proxiedHttpClientHandler)
    {
        BaseAddress = new Uri("uri");
        Timeout = 2000; //if you need timeout;
    }
}
_createHttpClient = () => ClientFactory();

ファクトリーの使用と手動によるhttpClientオブジェクトのインスタンス化について、良い議論があります here

0
Ben