Как настроить прокси по умолчанию для использования учетных данных по умолчанию?

У меня работает следующий код:

var webProxy = WebProxy.GetDefaultProxy();
webProxy.UseDefaultCredentials = true;
WebRequest.DefaultWebProxy = webProxy;

К несчастью, WebProxy.GetDefaultProxy() устарела. Что еще я должен делать?

(использование app.config для установки параметров defaultProxy недопустимо в моем развертывании)

9 ответов

Решение

Начиная с.NET 2.0 вам не нужно этого делать. Если вы явно не установите свойство Proxy в веб-запросе, оно будет использовать значение статического WebRequest.DefaultWebProxy. Если вы хотите изменить прокси, используемый во всех последующих веб-запросах, вы можете установить это статическое свойство DefaultWebProxy.

Поведение WebRequest.DefaultWebProxy по умолчанию заключается в использовании тех же базовых настроек, что и в Internet Explorer.

Если вы хотите использовать разные настройки прокси для текущего пользователя, вам нужно будет написать код

WebRequest webRequest = WebRequest.Create("http://stackru.com/");
webRequest.Proxy = new WebProxy("http://proxyserver:80/",true);

или же

WebRequest.DefaultWebProxy = new WebProxy("http://proxyserver:80/",true);

Также следует помнить, что объектная модель для прокси-серверов включает концепцию, что прокси-сервер может отличаться в зависимости от имени хоста назначения. Это может немного смущать при отладке и проверке свойства webRequest.Proxy. Вызов

webRequest.Proxy.GetProxy(new Uri("http://google.com.au")) чтобы увидеть фактические детали прокси-сервера, который будет использоваться.

Кажется, есть некоторые споры о том, можете ли вы установить webRequest.Proxy или же WebRequest.DefaultWebProxy = null для предотвращения использования любого прокси. Кажется, это работает хорошо для меня, но вы могли бы установить его new DefaultProxy() без параметров, чтобы получить требуемое поведение. Еще одна вещь, которую нужно проверить, это то, что если в файле конфигурации вашего приложения есть прокси-элемент, то.NET Framework НЕ будет использовать настройки прокси в Internet Explorer.

В статье MSDN Magazine более подробно рассказывается о происходящем под капотом.

Для тех, кто, в отличие от Brian Genisio, может установить содержимое файла конфигурации своего приложения:- ничего не делать в коде. Вместо этого добавьте это в ваш app.config / web.config.

<system.net>
  <defaultProxy useDefaultCredentials="true" />
</system.net>

Действительно и по умолчанию для использования учетных данных по умолчанию должно быть "true"; Я видел, как эта проблема сбивает с толку многих людей - разработчиков, пользователей, ИТ-ребят.

Для получения дополнительной информации см. Здесь:- http://sticklebackplastic.com/post/2007/01/26/Poxy-proxies.aspx

ОБНОВЛЕНИЕ: я создал эту проблему / идею для Microsoft, чтобы изменить значение по умолчанию для useDefaultCredentials с false на true, чтобы вся эта проблема исчезла и приложения.NET "просто работали"; Пожалуйста, проголосуйте, если вы согласны:
http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2397357-fix-it-so-that-net-apps-can-access-http-thru-auth

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

Это заставит DefaultWebProxy использовать учетные данные по умолчанию, аналогичный эффект, как через UseDefaultCredentials = true,

Отсюда все вновь созданные WebRequest экземпляры будут использовать прокси по умолчанию, который был настроен для использования учетных данных прокси по умолчанию.

Вы можете использовать Reflection, чтобы установить UseDefaultCredentials- Свойство из кода в "истина"

System.Reflection.PropertyInfo pInfo = System.Net.WebRequest.DefaultWebProxy.GetType().GetProperty("WebProxy", 
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

((System.Net.WebProxy)pInfo.GetValue(System.Net.WebRequest.DefaultWebProxy, null)).UseDefaultCredentials = true;

Похоже, что в некоторых более новых приложениях конфигурация отличается, как я видел в этом вопросе. Как пройти проверку подлинности на прокси-сервере при использовании класса HttpClient?

<system.net>
    <defaultProxy enabled="true" useDefaultCredentials="true">
         <proxy usesystemdefault="True" />
    </defaultProxy>
</system.net>

Также задокументировано на https://msdn.microsoft.com/en-us/library/dkwyc043.aspx

Эта ветка старая, но я только недавно наткнулся на проблему defaultProxy, и, возможно, она поможет другим.

Я использовал настройку конфигурации, как предложил Эндрю. При его развертывании мой клиент получил сообщение о том, что у него недостаточно прав для настройки конфигурации defaultProxy.

Не зная, почему я не имею права устанавливать эту конфигурацию и что с этим делать, я просто удалил ее, и она все еще работала. Так что, похоже, в VS2013 эта проблема исправлена.

И пока мы на этом:

    WebRequest.DefaultWebProxy.Credentials = new NetworkCredential("ProxyUsername", "ProxyPassword");

использует прокси по умолчанию с вашими учетными данными. Если вы хотите принудительно не использовать прокси, просто установите DefaultWebProxy на ноль (хотя я не знаю, хочет ли он этого).

В моем развертывании я не могу ни использовать app.config, чтобы встроить то, что предложил Эндрю Уэбб.
Итак, я делаю это:

    IWebProxy proxy = WebRequest.GetSystemWebProxy();
    proxy.Credentials = CredentialCache.DefaultCredentials;

    WebClient wc = new WebClient();
    wc.UseDefaultCredentials = true;
    wc.Proxy = proxy;

На всякий случай, если вы хотите проверить мои настройки IE:

В большинстве ответов здесь используются устаревшие API. Новый способ сделать это в Powershell 5/6/7:

[System.Net.WebRequest]::GetSystemWebProxy().Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials;

Вы можете поместить указанную выше строку в свои Powershell 5 и Powershell 6/7 $Profile.AllUsersAllHosts.

Это новый предложенный метод.

WebRequest.GetSystemWebProxy();

Нужно ли в некоторых системах устанавливать нулевое значение Proxy:

Net.WebRequest.DefaultWebProxy.Credentials = System.Net.CredentialCache.DefaultCredentials Dim-запрос как WebRequest = WebRequest.Create(sRemoteFileURL) request.Proxy = Nothing

Это ошибка.

Другие вопросы по тегам