はじめに
dotnet coreの2.1と3.0以降で、System.Net.Http.HttpClientのデフォルトhttpプロキシに関する挙動が異なるところがあったので記述する。
dotnet core 3.0以降
正式な仕様としては https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.defaultproxy?view=netcore-3.1 に記載がある。訳すと、
- 明示的な指定がない場合、全てのプラットフォームで環境変数の値をまず確認する
- http_proxy,https_proxy,all_proxy,no_proxyの三つ(大小文字問わず)
- ない場合は、OSごとに処理が異なる
- linuxはプロキシなしとして扱う
- winはOS設定(winhttpとwininetの設定)を使用する
- winhttpとwininetの両方で設定があった場合、wininetの方の設定が優先される
- macはOS設定を使用する
dotnet core 2.1
HttpClient.DefaultProxyは2.1に存在しないため他にないか探したが、ドキュメントには存在しなかった。
自分で調べた結果、まとめると、
- linuxの場合は環境変数のみ
- winの場合は環境変数は無視され、OS設定(winhttp,wininet)を使用する
- macの場合はシステム設定は無視され、環境変数のみ使われる
という具合のようだ。
主な差異
- winの場合、netcoreapp3.0の時は環境変数を優先して使用するが、netcoreapp2.1では考慮もされない
- linuxの場合は挙動は同じ
- macの場合は、netcoreapp2.1ではOS設定が無視される
まとめ
プロキシ設定というのは見過ごされやすい盲点になるので、挙動の違いは把握しておきたい。
特にmacは持ってないのでソースベースの解析になるが、間違っていたら指摘希望。