Есть ли способ получить System.Net.WebRequest
или System.Net.WebClient
для соблюдения файла hosts
или lmhosts
?
Например: в моем файле hosts у меня есть:
10.0.0.1 www.bing.com
Когда я пытаюсь загрузить Bing в браузер (как IE, так и FF), он не загружается, как ожидалось.
Dns.GetHostAddresses("www.bing.com")[0]; // 10.0.0.1
WebRequest.Create("http://10.0.0.1").GetResponse(); // throws exception (expected)
WebRequest.Create("http://www.bing.com/").GetResponse(); // unexpectedly succeeds
Аналогично:
WebClient wc = new WebClient();
wc.DownloadString("http://www.bing.com"); //succeeds
Почему System.Net.Dns
уважает файл hosts но System.Net.WebRequest
игнорировать это? Что мне нужно изменить, чтобы WebRequest учитывал файл hosts?
Дополнительная информация:
Редактировать
Согласно предложению @Richard Beier, я попробовал трассировку System.Net
. При трассировке ON WebRequest
завершается с ошибкой, как и должно быть. Однако, как только я отключаю трассировку , поведение возвращается к неожиданному успеху. Я воспроизвел это на тех же машинах, что и раньше, как в режиме отладки, так и в режиме выпуска.
Редактировать 2
Оказалось, что прокси-сервер компании дает нам проблемы. Нашим решением был пользовательский скрипт конфигурации прокси для наших тестовых компьютеров, на котором «bing.com» указывал на DIRECT вместо прокси по умолчанию.
Я думаю, что @Hans Passant обнаружил здесь проблему. Похоже, у вас настроен прокси в IE.
Dns.GetHostAddresses("www.bing.com")[0]; // 10.0.0.1
Это работает, потому что вы запрашиваете у ОС IP-адреса для www.bing.com
WebRequest.Create("http://www.bing.com/").GetResponse(); // unexpectedly succeeds
Это работает, потому что вы запрашиваете у фреймворка путь из имени сервера. Платформа использует тот же механизм и настройки, что и интерфейс IE, и, следовательно, если ваша компания указала в объекте групповой политики, что вы используете прокси-сервер компании, именно этот прокси-сервер разрешает IP-адрес для www.bing.com, а не вы.
WebRequest.Create("http://10.0.0.1").GetResponse(); // throws exception (expected)
Это работает / не работает, потому что вы запросили у фреймворка запрос на получение веб-страницы с определенного сервера (по IP).Даже если у вас установлен прокси-сервер, он все равно не сможет подключиться к этому IP-адресу.
Надеюсь, это поможет.
Джонатан
Этот ответ stackoverflow содержит быстрые и грязные конфигурации для отключения вашего прокси в .NET. Поместите его в свой web.config или app.config, и тогда System.Web не будет обращаться к базовой системе, чтобы получить конфигурацию прокси.
Я использую VS 2010 в Windows 7 и не могу воспроизвести это. Я сделал то же изменение файла хоста и запустил следующий код:
Console.WriteLine(Dns.GetHostAddresses("www.bing.com")[0]); // 10.0.0.1
var response = WebRequest.Create("http://www.bing.com/").GetResponse(); // * * *
Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd());
Я получил исключение в строке, помеченной «* * *». Вот подробности исключения:
System.Net.WebException was unhandled
Message=Unable to connect to the remote server
Source=System
StackTrace:
at System.Net.HttpWebRequest.GetResponse()
at ConsoleApplication2.Program.Main(String[] args) in c:\Data\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs:line 17
InnerException: System.Net.Sockets.SocketException
Message=A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 10.0.0.1:80
Source=System
ErrorCode=10060
Может быть, это проблема более ранней версии .NET, которая теперь исправлена в .NET 4 / VS 2010? Какую версию .NET вы используете?
Я также нашел эту ветку из 2007 года, где кто-то еще столкнулся с той же проблемой. Там есть несколько хороших предложений, в том числе следующие:
Включите system.net tracing
Обойдите проблему, используя Dns.GetHostAddresses () для разрешения ее на IP. Затем введите IP-адрес в URL-адрес - например, « http://10.0.0.1/ ». Хотя, возможно, это не вариант для вас.
В вышеупомянутом потоке mariyaatanasova_msft также говорит: «HttpWebRequest использует Dns.GetHostEntry для определения хоста, поэтому вы можете получить другой результат от Dns.GetHostAddresses».