目次
1. はじめに
Proxyというものはいつもいつも何かしら邪魔をしてきますよね。
しかし、会社PCを使用している限り、なかなか決別できないのがこのProxyさん。
今回はタイトルにある通り、Proxy環境においてHttpClientFactoryを使用する方法について記載します。
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());
}
}
以上です。
今日も一隅を照らすことができますように。それではまた。