Настройка прокси для 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 в конфиге.

Консультирую по продукту, собираю MVP и учу делать продукты самостоятельно. Поработать со мной →