2010-08-13 12 views
9

Gibt es eine Möglichkeit, eine System.Net.WebRequest oder System.Net.WebClient die hosts oder lmhosts Datei zu erhalten?System.Net.WebRequest nicht respektieren Hosts Datei

Zum Beispiel: in meinem hosts-Datei Ich habe:

10.0.0.1 www.bing.com 

Wenn ich versuche, Bing in einem Browser zu laden (IE und FF) es nicht wie erwartet geladen.

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 

Ähnlich:

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

Warum sollte System.Net.Dns respektieren die Hosts-Datei aber System.Net.WebRequest es ignorieren? Was muss ich ändern, damit WebRequest die hosts-Datei respektiert?

Zusätzliche Information:

  • Wenn ich IPv6 deaktivieren und meine IPv4-DNS-Server auf 127.0.0.1 gesetzt, der obige Code funktioniert (nicht) wie erwartet. Wenn ich jedoch meine normalen DNS-Server als Alternativen hinzufüge, wird das unerwartete Verhalten wieder aufgenommen.
  • Ich habe dies auf 3 Win7 und 2 Vista-Boxen reproduziert. Die einzige Konstante ist das Netzwerk meiner Firma.
  • Ich Vorschlag .NET 3.5 SP1 und VS2008 mit

bearbeiten

Per @ Richard Beier, versuchte ich System.Net Verfolgung aus. Mit der Verfolgung ON schlägt die WebRequest fehl, wie es sollte. Aber sobald ich die Verfolgung OFF drehen, kehrt das Verhalten zu dem unerwarteten Erfolg zurück. Ich habe dies sowohl im Debug- als auch im Release-Modus auf den gleichen Rechnern wie zuvor reproduziert.

Edit 2

Dies erwies sich das Unternehmen Proxy uns Fragen geben zu können. Unsere Lösung war ein benutzerdefiniertes Proxy-Konfigurationsskript für unsere Testmaschinen, bei denen "bing.com" auf DIRECT anstelle des Standard-Proxys zeigte.

+4

Ich vermute, Sie über einen Proxy in Ihrem Netzwerk arbeiten. Was macht Ihr Browser? –

+0

IE und FF verhalten sich wie erwartet (versuchen, von dem Server zu laden, der in der hosts-Datei angegeben ist). – Nate

+1

Haben Sie 'ipconfig/flushdns' probiert? – Aren

Antwort

7

Ich denke, dass @ Hans Passant das Problem hier entdeckt hat. Es sieht so aus, als ob Sie ein Proxy-Setup in IE haben.

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

Dies funktioniert, weil Sie das Betriebssystem fordern die IP-Adressen für www.bing.com

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

Dies funktioniert zu bekommen, weil, weil Sie den Rahmen fragen einen Weg von einem Server-Namen zu holen . Das Framework verwendet dieselbe Engine und dieselben Einstellungen, die das IE-Frontend verwendet. Wenn Ihr Unternehmen also von einem GPO angegeben hat, dass Sie einen Unternehmens-Proxy-Server verwenden, löst dieser Proxy-Server die IP-Adresse für www.bing.com auf.

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

Dies funktioniert/schlägt fehl, weil Sie das Framework aufgefordert haben, eine Webseite von einem bestimmten Server (per IP) zu holen. Selbst wenn Sie einen Proxy-Satz haben, kann dieser Proxy immer noch keine Verbindung zu dieser IP-Adresse herstellen.

Ich hoffe, dass dies hilft.

Jonathan

+0

Sie haben Recht, dass ich hinter einem Firmen-Proxy bin, aber ich bin mir nicht sicher, ob ich Ihrer Logik folge. Ich würde erwarten, dass 'WebRequest.Create()' das gleiche Verhalten wie IE aufweisen würde, aber nicht. Bing.com in IE mal versuchen, 10.0.0.1 zu laden – Nate

+0

Überprüfen Sie die web.config, um sicherzustellen, dass ein defaultProxy nicht eingerichtet ist - das Entfernen der oben für mich behoben. – Elliott

3

Ich verwende VS 2010 unter Windows 7, und ich kann das nicht reproduzieren. Ich habe die gleiche Hosts-Datei ändern und lief den folgenden Code:

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

ich eine Ausnahme auf der Linie bekam mit „* * *“. Hier ist die Ausnahme Detail:

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 

Vielleicht ist es ein Problem mit einer früheren .NET-Version, das ist jetzt behoben in .NET 4/VS 2010? Welche Version von .NET verwenden Sie?

Ich fand auch diese thread von 2007, wo jemand anderes in das gleiche Problem lief.Es gibt einige gute Vorschläge gibt, darunter die folgenden:

  • Schalten Sie system.net tracing

  • Arbeit, um das Problem durch Dns.GetHostAddresses mit(), um eine IP zu lösen. Dann lege die IP in die URL - z.B. "http://10.0.0.1/". Das mag für dich keine Option sein.

Im oben genannten Thread, sagt mariyaatanasova_msft auch: "HttpWebRequest verwendet Dns.GetHostEntry den Host zu beheben, so dass Sie ein anderes Ergebnis aus Dns.GetHostAddresses bekommen kann".

+0

Ich verwende VS2008 und 3.5 SP1. 'GetHostEntry' gibt mir die gleiche Ausgabe wie' GetHostAddress'. Ich werde nachverfolgen. Vielen Dank. – Nate

+0

System.Net-Ablaufverfolgung gemäß Ihrem Vorschlag aktiviert. Wenn die Ablaufverfolgung aktiviert ist, schlägt die WebRequest wie erwartet fehl. Mit der Verfolgung geht es zu unerwartetem Erfolg zurück. Gedanken? – Nate

+0

Das ist sehr seltsam - ich habe keine gute Antwort. Hans Passant und Jonathan Stanton haben gute Argumente für Proxies.Wenn IE jedoch einen Proxy verwendet und die Datei hosts weiterhin berücksichtigt, sollte die hosts-Datei auch den Proxy überschreiben, wenn WebRequest verwendet wird. Die einzige Sache, die ich vorschlagen kann, ist zu versuchen, den Proxy sowieso zu deaktivieren, wie mwalker's suggeriert. Sie könnten auch einen Paket-Sniffer wie Wireshark oder Network Monitor ausprobieren, um zu sehen, was auf dem Draht passiert - aber ich bin nicht sicher, dass das helfen wird. Wenn Sie eine DNS-Anfrage für www.bing.com sehen, bestätigt das, dass die Datei hosts nicht verwendet wird, erklärt aber nicht warum. –

2

This stackoverflow answer hat die schnelle und schmutzige configs Ihre Proxy in .NET zu deaktivieren. Fügen Sie es in Ihre Datei web.config oder app.config ein, und System.Web sucht dann nicht nach dem zugrunde liegenden System, um dessen Proxy-Konfiguration zu erhalten.

0

Sie sollten den Standardproxy überschreiben. HttpWebRequest & WebRequest stellt einen Standardproxy ein, wenn er in Internet Explorer vorhanden ist und Ihre Datei Hosts wird umgangen.

request.Proxy = new WebProxy(); 

Das folgende ist nur ein Beispiel für den Code ein:

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 
} 
Verwandte Themen