System .Net.WebRequest не относится к файлу hosts

Есть ли способ получить 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?

Дополнительная информация:

  • Если я отключу IPv6 и установлю свой DNS-сервер IPv4 на 127.0.0.1, приведенный выше код работает (не работает), как и ожидалось. Однако если я добавлю свои обычные DNS-серверы обратно в качестве альтернатив, неожиданное поведение возобновится.
  • Я воспроизвел это на 3-х Win7 и 2-х Vista. Единственной константой является сеть моей компании.
  • Я использую .NET 3.5 SP1 и VS2008

Редактировать

Согласно предложению @Richard Beier, я попробовал трассировку System.Net . При трассировке ON WebRequest завершается с ошибкой, как и должно быть. Однако, как только я отключаю трассировку , поведение возвращается к неожиданному успеху. Я воспроизвел это на тех же машинах, что и раньше, как в режиме отладки, так и в режиме выпуска.

Редактировать 2

Оказалось, что прокси-сервер компании дает нам проблемы. Нашим решением был пользовательский скрипт конфигурации прокси для наших тестовых компьютеров, на котором «bing.com» указывал на DIRECT вместо прокси по умолчанию.

9
задан Nate 17 August 2010 в 20:48
поделиться

3 ответа

Я думаю, что @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-адресу.

Надеюсь, это поможет.

Джонатан

7
ответ дан 4 December 2019 в 19:32
поделиться

Этот ответ stackoverflow содержит быстрые и грязные конфигурации для отключения вашего прокси в .NET. Поместите его в свой web.config или app.config, и тогда System.Web не будет обращаться к базовой системе, чтобы получить конфигурацию прокси.

2
ответ дан 4 December 2019 в 19:32
поделиться

Я использую 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».

3
ответ дан 4 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: