現象
仕事で、以下のようなWebアプリケーション開発を行っていたときのことです。
- ASP.NET Core フレームワークを使用
- Windows Server で IIS に構成
- WebサーバーとAPサーバーは同一サーバーに構成
- Webサーバー⇔APサーバーの通信は System.Net.Http.HttpClientを使用
- 上記の通信の際のURLはlocalhost指定
元々、当該アプリケーションは、当初.NET Core 2.1 で開発を行っていました。
しかし、.NET Core 2.1 がサポート終了となったこともあって、.NET Core 3.1に移行したという経緯があります。
そして、移行したバージョンを開発で使っている環境に適用するとどうもうまく動かない、という現象が発生しました。開発用の環境以外ではうまく動作しており、環境依存である状況…
デバッグでエラー箇所を特定したところ、どうやらWebサーバー⇒APサーバーの通信処理(HttpClient.GetStiringAsync)で例外が発生しているようでした。
原因
原因としては、
- HttpClient は、.NET Core 3.0 から プロキシ設定を明示しない場合の規定値を環境変数から設定を行うようになった
- 当該環境では、環境変数にプロキシ設定が行われていた
ことのようです。
.NET Core 3.0 から、HttpClient にプロパティ DefaultProxy が追加されており、Microsoft のページでは以下の記載になっています。
この静的プロパティは、コンストラクターを介して渡される でプロキシが明示的に設定されていない場合に、すべてのインスタンスが使用する既定 HttpClient HttpClientHandler のプロキシを決定します。
このプロパティによって返される既定のインスタンスは、プラットフォームに応じて異なる規則のセットに従って初期化されます。
Windows: 環境変数からプロキシ構成を読み取ります。定義されていない場合は、ユーザーのプロキシ設定から読み取ります。
(中略)
Windows環境変数は次のとおりです。
・HTTP_PROXY: HTTP 要求で使用されるプロキシ サーバー。
・HTTPS_PROXY: HTTPS 要求で使用されるプロキシ サーバー。
・ALL_PROXY: HTTP 要求や HTTPS 要求で使用されるプロキシ サーバーが、HTTP_PROXYまたはHTTPS_PROXY定義されていません。
・NO_PROXY: プロキシから除外するホスト名のコンマ区切りの一覧。
(中略)
適用対象
HttpClient.DefaultProxy プロパティ
製品 バージョン .NET Core 3.0, Core 3.1, 5, 6
現象が発生した環境を確認してみると、勤務先の会社の環境ですので、当然プロキシ環境です。
また、該当の環境は開発用の環境でして、Node.js の npm install を使用するために環境変数 ( HTTP_PROXY HTTPS_PROXY )を設定していたのでした…
そのため、localhost宛ての通信がプロキシサーバーに問い合わせられてエラーとなっていたようです。(多分…)
対策
localhost 宛への通信を、プロキシ経由の対象外に設定します。
具体的には、Windows の場合、システム環境変数 に以下を追加します。
変数名 | 変数値 |
NO_PROXY | localhost;127.0.0.1 |
上記設定後、無事に動作するようになりました。
おわりに
3.1のサポートも今年12月までのようなので、また移行時に何かあるかも
つらみがふかい