2010-08-13 10 views
9

C'è un modo per ottenere un System.Net.WebRequest o System.Net.WebClient per rispettare il file hosts o lmhosts?System.Net.WebRequest non rispetta il file hosts

Per esempio: nel mio file hosts che ho:

10.0.0.1 www.bing.com 

quando provo a caricare Bing in un browser (IE e FF) non riesce a caricare come previsto.

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 

Allo stesso modo:

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

Perché sarebbe System.Net.Dns rispettare il file hosts ma System.Net.WebRequest ignorarlo? Cosa devo modificare per rendere la richiesta WebRequest il file hosts?

Informazione supplementare:

  • Se rendo invalido IPv6 e IPv4 impostare il mio server DNS a 127.0.0.1, il codice precedente funziona (fallisce) come previsto. Tuttavia, se aggiungo i miei normali server DNS come sostituti, riprende il comportamento imprevisto.
  • Ho riprodotto questo su 3 Win7 e 2 scatole di Vista. L'unica costante è la rete della mia azienda.
  • sto usando .NET 3.5 SP1 e VS2008

Modifica

suggerimento di Per @pluto Beier, ho provato System.Net tracing. Con tracciando ON la WebRequest non riesce come dovrebbe. Tuttavia, come appena mi volto tracciando OFF il comportamento ritorna al successo inaspettato. L'ho riprodotto sulle stesse macchine di prima in entrambe le modalità di debug e release.

Edit 2

questo si è rivelato essere il proxy aziendale dandoci problemi. La nostra soluzione è stata uno script di configurazione proxy personalizzato per le nostre macchine di test che ha avuto "bing.com" Punto su DIRECT al posto del proxy predefinito.

+4

Sto indovinando si sta lavorando attraverso un proxy nella rete. Cosa fa il tuo browser? –

+0

Sia IE che FF si comportano come previsto (tentativo di caricamento dal server indicato nel file hosts). – Nate

+1

Hai provato 'ipconfig/flushdns'? – Aren

risposta

7

Penso che @Hans Passant abbia individuato il problema qui. Sembra che tu abbia una configurazione proxy in IE.

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

Questo funziona perché si sta chiedendo il sistema operativo per ottenere gli indirizzi IP per www.bing.com

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

Questo funziona perché, perché si sta chiedendo il quadro per andare a prendere un percorso da un nome di server . Il framework utilizza lo stesso motore e le stesse impostazioni utilizzate dal frontend di IE e, quindi, se la propria azienda ha specificato un oggetto Criteri di gruppo che si utilizza un server proxy aziendale, è il server proxy che risolve l'indirizzo IP per www.bing.com anziché dall'utente.

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

Questo funziona/fallisce perché avete chiesto il per il quadro a prenderti una pagina web da un server specifico (da IP). Anche se si dispone di un set proxy, questo proxy non sarà ancora possibile connettersi a questo indirizzo IP.

Spero che questo aiuti.

Jonathan

+0

Hai ragione che sono dietro un proxy aziendale, ma non sono sicuro di seguire la tua logica. Mi aspetterei che 'WebRequest.Create()' mostri un comportamento identico a IE ma non lo fa. Bing.com in IE scade cercando di caricare 10.0.0.1 – Nate

+0

Controlla il web.config per assicurarti che un defaultProxy non sia impostato - rimuovendo ciò per me è stato corretto. – Elliott

3

Sto utilizzando VS 2010 su Windows 7, e non riesco a riprodurre questo. Ho fatto la stessa modifica gli host file e corse il seguente codice:

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

ho ricevuto un'eccezione sulla linea marcata "* * *". Ecco il dettaglio eccezione:

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 

Forse è un problema con una versione precedente di .NET, che è ora fissato in .NET 4/VS 2010? Quale versione di .NET stai usando?

Ho trovato anche questo thread a partire dal 2007, in cui qualcun altro ha incontrato lo stesso problema.Ci sono alcuni buoni suggerimenti lì, tra cui le seguenti:

  • Accendere system.net tracing

  • aggirare il problema utilizzando Dns.GetHostAddresses() per risolvere ad un IP. Quindi inserisci l'indirizzo IP nell'URL, ad es. "http://10.0.0.1/". Tuttavia, potrebbe non essere un'opzione per te.

Nel thread di cui sopra, mariyaatanasova_msft dice anche: "HttpWebRequest utilizza Dns.GetHostEntry per risolvere l'host, in modo si può ottenere un risultato diverso da Dns.GetHostAddresses".

+0

Sto usando VS2008 e 3.5 SP1. 'GetHostEntry' mi dà lo stesso risultato di' GetHostAddress'. Guarderò nella traccia. Grazie. – Nate

+0

Attivata la traccia System.Net come suggerimento. Con la traccia, WebRequest ha esito negativo come previsto. Con il rintracciamento torna a un successo inaspettato. Pensieri? – Nate

+0

Questo è molto strano - non ho una buona risposta. Hans Passant e Jonathan Stanton hanno buoni punti per quanto riguarda i proxy.Ma se IE usa un proxy e rispetta ancora il file hosts, allora il file hosts dovrebbe anche sovrascrivere il proxy quando si usa WebRequest. L'unica cosa che posso suggerire è provare comunque a disattivare il proxy, come suggerito da mwalker. Puoi anche provare uno sniffer di pacchetti come Wireshark o Network Monitor per vedere cosa sta succedendo sul filo - ma non sono sicuro che ciò possa aiutarti. Se vedi una richiesta DNS per www.bing.com, ciò conferma che non sta utilizzando il file hosts, ma non spiega il perché. –

2

This stackoverflow answer ha le configurazioni veloci e sporchi per disabilitare il proxy all'interno di .NET. Mettilo nel tuo web.config o app.config e poi System.Web non guarderà al sistema sottostante per ottenere la sua configurazione proxy.

0

È necessario sovrascrivere il proxy predefinito. HttpWebRequest & WebRequest fisserà un proxy predefinito se presenti in Internet Explorer e il file hosts sarà bypassate.

request.Proxy = new WebProxy(); 

Quello che segue è solo un esempio di codice:

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 
} 
Problemi correlati