Вопрос

Есть ли способ получить System.Net.WebRequest или System.Net.WebClient уважать hosts или lmhosts файл?

Например: в файле моих хозяев у меня есть:

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 Уважайте файл хостов, но System.Net.WebRequest игнорируй это? Что мне нужно изменить, чтобы сделать WebRequest уважать файл хостов?

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

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

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

На предложение @richard Beier я попробовал System.Net трассировка. С трассировкой НА то WebRequest Не удается, как это должно. Однако, как только я превращаю отслеживание ВЫКЛЮЧЕННЫЙ Поведение возвращается к неожиданному успеху. Я воспроизвел это на одних и тех же машинах, что и в режиме отладки, так и в режиме выпуска.

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

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

Это было полезно?

Решение

Я думаю, что @hans Passant заметил эту проблему здесь. Похоже, у вас есть настройка прокси в IE.

Dns.GetHostAddresses("www.bing.com")[0]; // 10.0.0.1  

Это работает, потому что вы задаете ОС, чтобы получить IP-адреса для www.buz.com

WebRequest.Create("http://www.bing.com/").GetResponse(); // unexpectedly succeeds

Это работает, потому что, поскольку вы задаете структуру, чтобы получить путь от имени сервера. Рамочная структура использует тот же двигатель и настройки, которые IE Frontend используют, и, следовательно, если ваша компания указывала объект групповым объектом, что вы используете прокси-сервер компании, именно тот прокси-сервер, который разрешает IP-адрес для www.bing.com, а не вы.

WebRequest.Create("http://10.0.0.1").GetResponse(); // throws exception (expected) 

Это работает / не удается, потому что вы попросили основные рамки получать вам веб-страницу с определенного сервера (по IP). Даже если у вас есть прокси-набор, этот прокси все равно будет не бесплатно подключаться к этому IP-адресу.

Я надеюсь, что это помогает.

Джонатан

Другие советы

Я использую VS 2010 на Windows 7, и я не могу воспроизвести это. Я сделал одни и те же файлы Hosts-файла и запустил следующий код:

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.Gethostadddresses (), чтобы разрешить его на IP. Затем поставьте IP в URL-адрес - например,http://10.0.0.1/«Это может быть не вариант для вас, хотя.

В вышеуказанном потоке Mariyaatanasova_msft также говорит: «HttpWebRequest использует DNS.Geethostentry, чтобы разрешить хост, чтобы вы могли получить другой результат от DNS.Gethostaddresses».

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

Вы должны перезаписать прокси по умолчанию. Httpwebrequest & webRequest будет установить прокси по умолчанию, если он присутствует в Internet Explorer и ваш файл хосты будет обойден.

request.Proxy = new WebProxy();

Ниже приведен только пример кода:

try
{
   HttpWebRequest request = (HttpWebRequest)WebRequest.Create("www.bing.com");
   request.Proxy = new WebProxy();
   request.Method = "POST";            
   request.AllowAutoRedirect = false;

   HttpWebResponse response = (HttpWebResponse)request.GetResponse();               
   if (response.StatusCode == HttpStatusCode.OK)
   {
      //some code here
   }
}
catch (exception e)
{
   //Some other code here
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top