2010-08-13 8 views
9

¿Hay alguna manera de obtener un System.Net.WebRequest o System.Net.WebClient para respetar el archivo hosts o lmhosts?System.Net.WebRequest no respeta el archivo hosts

Por ejemplo: en mi archivo de hosts que tengo:

10.0.0.1 www.bing.com 

Cuando intento cargar Bing en un navegador (IE y FF) que no se carga como se esperaba.

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 

mismo modo:

WebClient wc = new WebClient(); 
wc.DownloadString("http://www.bing.com"); //succeeds 

Por qué sería System.Net.Dns respetar el archivo hosts, pero System.Net.WebRequest ignorarlo? ¿Qué debo cambiar para que la WebRequest respete el archivo de hosts?

Información adicional:

  • Si desactivo IPv6 e IPv4 configurar mi servidor DNS a 127.0.0.1, funciona el código anterior (falla) como se esperaba. Sin embargo, si vuelvo a agregar mis servidores DNS normales como alternos, se reanuda el comportamiento inesperado.
  • He reproducido esto en 3 cajas de Win7 y 2 de Vista. La única constante es la red de mi compañía.
  • estoy usando .NET 3.5 SP1 y VS2008

Editar

sugerencia de Per @Richard Beier, probé System.Net trazado. Con el seguimiento ON, el WebRequest falla como debería. Sin embargo, tan pronto como gire el seguimiento OFF, el comportamiento vuelve al éxito inesperado. He reproducido esto en las mismas máquinas que antes tanto en el modo de depuración como en el de liberación.

Editar 2

Este resultó ser el proxy empresa que nos da problemas. Nuestra solución era un script de configuración de proxy personalizado para nuestras máquinas de prueba que tenían el punto "bing.com" en DIRECTO en lugar del proxy predeterminado.

+4

supongo que está trabajando a través de un proxy en su red. ¿Qué hace tu navegador? –

+0

Tanto IE como FF se comportan como se espera (intentando cargar desde el servidor indicado en el archivo hosts). – Nate

+1

¿Has probado 'ipconfig/flushdns'? – Aren

Respuesta

7

Creo que @Hans Passant ha detectado el problema aquí. Parece que tienes una configuración proxy en IE.

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

Esto funciona porque usted está pidiendo el sistema operativo para obtener las direcciones IP de www.bing.com

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

Esto funciona porque debido a que está pidiendo el marco para ir a buscar un camino desde un nombre de servidor . El marco utiliza el mismo motor y la misma configuración que utiliza el frontend IE y, por lo tanto, si su empresa ha especificado que utiliza un servidor proxy de la empresa, ese es el servidor proxy que resuelve la dirección IP de www.bing.com en lugar de usted.

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

Esto funciona/falla, ya que han pedido a la para el marco que le ha podido ir a una página web desde un servidor específico (por IP). Incluso si tiene un conjunto proxy, este proxy aún no podrá conectarse a esta dirección IP.

Espero que esto ayude.

Jonathan

+0

Tiene razón de estar detrás de un proxy de la compañía, pero no estoy seguro de seguir su lógica. Yo esperaría que 'WebRequest.Create()' muestre un comportamiento idéntico al de IE pero no lo hace. Bing.com en IE agota el tiempo de carga de 10.0.0.1 – Nate

+0

Comprueba el archivo web.config para asegurarte de que no se haya configurado un proxy por defecto, eliminando esto por mí. – Elliott

3

Estoy usando VS 2010 en Windows 7, y no puedo reproducir esto. Hice el mismo cambio anfitriones-archivo y encontré el siguiente código:

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()); 

Tengo una excepción en la línea marcada "* * *". En detalle excepción:

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 

Tal vez sea un problema con una versión anterior de .NET, que ahora está fijada en .NET 4/VS 2010? ¿Qué versión de .NET estás usando?

También encontré esto thread de 2007, donde alguien más se encontró con el mismo problema.Hay algunas buenas sugerencias allí, incluyendo las siguientes:

  • Encienda system.net tracing

  • solucionar el problema utilizando Dns.GetHostAddresses() para resolver a una IP. Luego coloque el IP en la URL, p. "http://10.0.0.1/". Sin embargo, puede que esa no sea una opción para ti.

En el hilo anterior, mariyaatanasova_msft también dice: "HttpWebRequest utiliza Dns.GetHostEntry para resolver el anfitrión, por lo que puede obtener un resultado diferente de Dns.GetHostAddresses".

+0

Estoy usando VS2008 y 3.5 SP1. 'GetHostEntry' me da el mismo resultado que' GetHostAddress'. Buscaré en el rastreo. Gracias. – Nate

+0

Se activó el rastreo de System.Net de acuerdo con su sugerencia. Con el seguimiento activado, WebRequest falla como se esperaba. Con el rastreo, vuelve a tener un éxito inesperado. ¿Pensamientos? – Nate

+0

Eso es muy extraño, no tengo una buena respuesta. Hans Passant y Jonathan Stanton tienen buenos puntos con respecto a los poderes.Pero si IE usa un proxy y aún respeta su archivo de hosts, entonces el archivo de hosts también debe anular el proxy al usar WebRequest. Lo único que puedo sugerir es intentar deshabilitar el proxy de todos modos, como sugiere mwalker. También puede probar un detector de paquetes como Wireshark o Network Monitor para ver lo que sucede en el cable, pero no estoy seguro de que eso ayude. Si ve una solicitud DNS para www.bing.com, eso confirma que no está utilizando el archivo hosts, pero no explica por qué. –

2

This stackoverflow answer tiene las configuraciones rápidas y sucias para desactivar el proxy en .NET. Colóquelo en su web.config o app.config y luego System.Web no buscará en el sistema subyacente su configuración de proxy.

0

Debe sobrescribir el proxy predeterminado. HttpWebRequest & WebRequest establecerá un proxy predeterminado si está presente en Internet Explorer y su archivo hosts será omitido.

request.Proxy = new WebProxy(); 

El siguiente es sólo un ejemplo de código:

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 
} 
Cuestiones relacionadas