Настройка прокси для IIS-приложений через web.config
Для ASP.NET-приложения на .NET Framework добавьте в web.config секцию system.net внутри <configuration>:
<configuration>
<system.net>
<defaultProxy>
<proxy proxyaddress="http://192.168.0.1:8080" bypassonlocal="true" />
</defaultProxy>
</system.net>
</configuration>
Теперь исходящие запросы приложения (HttpWebRequest, WebClient и HttpClient на .NET Framework) идут через 192.168.0.1:8080. ASP.NET перезапускает приложение, когда меняется web.config, больше ничего делать не нужно.
ASP.NET Core эту секцию не читает, про него в конце.
Атрибуты
proxyaddress— адрес прокси полным URI со схемой:http://host:port.bypassonlocal="true"— запросы к localhost, 127.0.0.1 и к именам без точки (http://webserver) идут мимо прокси.usesystemdefault="true"— взять системные настройки прокси из «Свойств браузера», а заданные атрибуты их перекроют. Эти настройки свои у каждого пользователя Windows, а у учётной записи пула приложений их обычно нет, поэтому на IIS указывайтеproxyaddressявно.useDefaultCredentials="true"уdefaultProxy— если прокси требует Windows-аутентификацию, приложение войдёт под учётной записью пула. УApplicationPoolIdentityв сети это учётная запись компьютера.enabled="false"уdefaultProxy— не использовать прокси в этом приложении.<bypasslist>— регулярные выражения для адресов, которые идут мимо прокси.
Всё вместе:
<configuration>
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
<proxy proxyaddress="http://proxy.corp.local:8080"
bypassonlocal="true"
usesystemdefault="false" />
<bypasslist>
<!-- Регулярное выражение: все хосты в corp.local, на любом порту -->
<add address="[a-z0-9-]+\.corp\.local(:\d+)?$" />
</bypasslist>
</defaultProxy>
</system.net>
</configuration>
Та же секция в %WINDIR%\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config действует на все 64-битные приложения .NET Framework 4.x на сервере. 32-битные пулы читают папку Framework вместо Framework64.
Проверить, что запросы идут через прокси
С сервера проверьте, что прокси вообще выпускает наружу. curl.exe есть в Windows 10 1803, Windows Server 2019 и новее:
curl.exe -I -x http://192.168.0.1:8080 https://example.com
Внутри приложения спросите у .NET, какой прокси он возьмёт для адреса:
var target = new Uri("https://example.com/");
var proxy = WebRequest.DefaultWebProxy.GetProxy(target);
// proxy == target: запрос пойдёт напрямую, без прокси
ASP.NET Core под IIS
.NET Core и .NET 5+ не читают system.net из web.config. HttpClient берёт прокси из переменных окружения HTTP_PROXY, HTTPS_PROXY, ALL_PROXY и NO_PROXY, а на Windows, если их нет, — из настроек прокси пользователя. Переменные можно задать в секции aspNetCore того же web.config:
<aspNetCore processPath="dotnet" arguments=".\MyApp.dll"
hostingModel="inprocess">
<environmentVariables>
<environmentVariable name="HTTP_PROXY" value="http://192.168.0.1:8080" />
<environmentVariable name="HTTPS_PROXY" value="http://192.168.0.1:8080" />
<environmentVariable name="NO_PROXY" value="localhost,.corp.local" />
</environmentVariables>
</aspNetCore>
NO_PROXY — список через запятую, без звёздочек. .corp.local с точкой в начале совпадает с corp.local и всеми его поддоменами, corp.local без точки — только с этим хостом.
Или задайте прокси в коде при старте, до первого запроса:
HttpClient.DefaultProxy = new WebProxy("http://192.168.0.1:8080", true);
Второй аргумент — BypassOnLocal, как bypassonlocal в конфиге.