Я работаю в офисе, который требует, чтобы все подключения выполнялись через определенный http-прокси. Мне нужно написать простое приложение для запроса некоторых значений с веб-сервера - это легко, если не было прокси. Как я могу сделать прокси-сервер приложений С#? Как я могу сделать какое-либо соединение через прокси?
С# Подключение через прокси
Ответ 1
Это легко достигается программно, в вашем коде или декларативно в файле web.config или app.config.
Вы можете программно создать прокси-сервер так:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("[ultimate destination of your request]");
WebProxy myproxy = new WebProxy("[your proxy address]", [your proxy port number]);
myproxy.BypassProxyOnLocal = false;
request.Proxy = myproxy;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
В основном вы назначаете объект WebProxy
объекту request
object proxy
. Этот request
будет использовать proxy
, который вы определяете.
Чтобы сделать то же самое декларативно, вы можете сделать следующее:
<system.net>
<defaultProxy>
<proxy
proxyaddress="http://[your proxy address and port number]"
bypassonlocal="false"
/>
</defaultProxy>
</system.net>
внутри вашего web.config или app.config. Это устанавливает прокси-сервер по умолчанию, который будут использовать все HTTP-запросы. В зависимости от того, что вам нужно достичь, вы можете или не нуждаться в некоторых дополнительных атрибутах defaultProxy/proxy, поэтому, пожалуйста, обратитесь к документации для них.
Ответ 2
Если вы используете WebClient
, у него есть свойство Proxy, которое вы можете использовать.
Как уже упоминалось, существует несколько способов автоматизации обнаружения/использования параметров прокси-сервера
Web.Config:
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
<proxy usesystemdefault="true" bypassonlocal="true" />
</defaultProxy>
</system.net>
Использование класса WebProxy, как описано в в этой статье.
Вы также можете настроить параметры прокси-сервера напрямую (config или code), и ваше приложение затем будет использовать их.
Web.Config:
<system.net>
<defaultProxy>
<proxy
proxyaddress="http://[proxy address]:[proxy port]"
bypassonlocal="false"
/>
</defaultProxy>
</system.net>
код:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("url");
WebProxy myproxy = new WebProxy("[proxy address]:[proxy port]", false);
request.Proxy = myproxy;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
Ответ 3
Если вы хотите, чтобы приложение использовало прокси-сервер по умолчанию, добавьте его в свой Application.exe.config(где application.exe - это имя вашего приложения):
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
<proxy usesystemdefault="true" bypassonlocal="true" />
</defaultProxy>
</system.net>
Более подробную информацию можно найти в статье MSDN в System.Net
Ответ 4
Попробуйте этот код. Вызовите его, прежде чем делать какие-либо HTTP-запросы. Код будет использовать прокси-сервер из ваших настроек Internet Explorer. Тем не менее, я использую proxy.Credentials = ....
, потому что мой прокси-сервер является NTLM-аутентифицированным сервером Internet Acceleration Server. Дайте ему свист.
static void setProxy()
{
WebProxy proxy = (WebProxy)WebProxy.GetDefaultProxy();
if(proxy.Address != null)
{
proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
WebRequest.DefaultWebProxy = new System.Net.WebProxy(proxy.Address, proxy.BypassProxyOnLocal, proxy.BypassList, proxy.Credentials);
}
}
Ответ 5
Этот однострочник работает для меня:
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;
CredentialCache.DefaultNetWorkCredentials
- настройки прокси, установленные в Internet Explorer.
WebRequest.DefaultWebProxy.Credentials
используется для всех подключений к Интернету в приложении.
Ответ 6
Foole-код работал отлично для меня, но в .NET 4.0 не забудьте проверить, является ли прокси NULL, что означает, что прокси-сервер не настроен (вне корпоративной среды)
Итак, вот код, который решил мою проблему с нашим корпоративным прокси
WebClient web = new WebClient();
if (web.Proxy != null)
web.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
Ответ 7
Этот код работал у меня:
WebClient wc = new WebClient();
wc.Proxy.Credentials = CredentialCache.DefaultCredentials;
Ответ 8
Автоматическое определение прокси-сервера - это процесс, с помощью которого веб-прокси-сервер идентифицируется и используется для отправки запросов от имени клиента. Эта функция также известна как Автоматическое обнаружение веб-прокси (WPAD). Когда включено автоматическое определение прокси-сервера, система пытается найти конфигурацию прокси-сервера script, которая отвечает за возврат набора прокси-серверов, которые могут быть использованы для запроса.
Ответ 9
var getHtmlWeb = new HtmlWeb() { AutoDetectEncoding = false, OverrideEncoding = Encoding.GetEncoding("iso-8859-2") };
WebProxy myproxy = new WebProxy("127.0.0.1:8888", false);
NetworkCredential cred = (NetworkCredential)CredentialCache.DefaultCredentials;
var document = getHtmlWeb.Load("URL", "GET", myproxy, cred);
Ответ 10
Я собираюсь использовать пример для добавления к приведенным выше ответам.
Я столкнулся с проблемами прокси, пытаясь установить пакеты через Установщик веб-платформы
В этом тоже используется файл конфигурации WebPlatformInstaller.exe.config
Я попробовал изменения, предлагаемые в этом форуме IIS, который
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<defaultProxy enabled="True" useDefaultCredentials="True"/>
</system.net>
</configuration>
и
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<defaultProxy>
<proxy
proxyaddress="http://yourproxy.company.com:80"
usesystemdefault="True"
autoDetect="False" />
</defaultProxy>
</system.net>
</configuration>
Ни один из них не работал.
Что для меня работало -
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="false">
<module type="WebPI.Net.AuthenticatedProxy, WebPI.Net, Version=1.0.0.0, Culture=neutral, PublicKeyToken=79a8d77199cbf3bc" />
</defaultProxy>
</system.net>
Модуль должен быть зарегистрирован в установщике веб-платформы, чтобы использовать его.