[c#]Proxy環境でHttpClientFactoryを使用する方法

目次

1. はじめに

Proxyというものはいつもいつも何かしら邪魔をしてきますよね。

しかし、会社PCを使用している限り、なかなか決別できないのがこのProxyさん。

今回はタイトルにある通り、Proxy環境においてHttpClientFactoryを使用する方法について記載します。

最近では HttpClientFactory を通して HttpClient を生成するのが一般的ですが、一応レガシーコードでHttpClient を直接生成しているよーという方のためにも、HttpClient での使用方法を後で記載しておきます。

2. HttpClientFactoryを使用する

HttpClientFactoryを使用する場合、一般的にはStartup.csのようなスタートアップスクリプトに以下のような記述をします。

public class Startup
{
    ~
    public void ConfigureServices(IServiceCollection services)
    {
        ~
        services.AddHttpClient();
        ~
    }
}

Proxy環境でない場合はこれでOKなのですが、Proxy環境の場合、Proxyを考慮したHttpClientを生成する必要があります。

このコードだと、Proxyを考慮しないHttpClientがFactoryから生成されてしまうということですね。

よって、ここのコードを以下のように書き換えます。

using System;
using System.Net;
using System.Net.Http;

public class Startup
{
    ~
    public void ConfigureServices(IServiceCollection services)
    {
        ~
        services
            .AddHttpClient("testhttp")
            .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
            {
                Proxy = new WebProxy
                {
                    Address = new Url("http://testproxy:8080"),
                    BypassProxyOnLocal = false,
                    UseDefaultCredentials = false,
                    Credentials = new NetworkCredential("test", "test"),
                }
            });
        ~
    }
}

ここでは「testhttp」という名称でProxyを使用するHttpClientを定義しています。

ProxyのAddressにはProxyサーバのアドレスをポート番号付きで記述します。

CredentialsにはProxyサーバのユーザ名とパスワードを記述します。

スタートアップスクリプトが書けたので、後は実際に使用するだけです。

public class TestController : Controller
{
    private readonly IHttpClientFactory _httpClientFactory;
    public TestController(IHttpClientFactory httpClientFactory)
    {
        this._httpClientFactory = httpClientFactory;
    }
    public async Task<IActionResult> Index()
    {
        var client = this._httpClientFactory.CreateClient("testhttp");
        var result = await client.GetAsync("https://~");
        return Content(await result.Content.ReadAsStringAsync());
    }
}

3. (おまけ)HttpClientを使用する

HttpClientの直生成に色々と問題があることはググればわかることですが、

一応使用方法を記載します。

public class TestController : Controller
{
    public TestController()
    {
    }
    public async Task<IActionResult> Index()
    {
        var proxy = new WebProxy
        {
            Address = new Url("http://testproxy:8080"),
            BypassProxyOnLocal = false,
            UseDefaultCredentials = false,
            Credentials = new NetworkCredential("test", "test"),
        };
        var httpClientHandler = new HttpClientHandler
        {
            Proxy = proxy,
        }
        var client = new HttpClient(httpClientHandler);
        var result = await client.GetAsync("https://~");
        return Content(await result.Content.ReadAsStringAsync());
    }
}

以上です。

今日も一隅を照らすことができますように。それではまた。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次