9

System.Net.WebRequestorファイルSystem.Net.WebClientを取得する方法はありますhostsか?lmhosts

例:私のホストファイルには次のものがあります:

10.0.0.1  www.bing.com

ブラウザー (IE と FF の両方) で Bing を読み込もうとすると、期待どおりに読み込めません。

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.Dnshostsファイルを尊重するのにSystem.Net.WebRequest無視するのはなぜですか? WebRequest が hosts ファイルを尊重するようにするには、何を変更する必要がありますか?

追加情報:

  • IPv6 を無効にして IPv4 DNS サーバーを 127.0.0.1 に設定すると、上記のコードは期待どおりに機能 (失敗) します。ただし、通常の DNS サーバーを代替として追加すると、予期しない動作が再開されます。
  • これを 3 台の Win7 ボックスと 2 台の Vista ボックスで再現しました。唯一の定数は、私の会社のネットワークです。
  • .NET 3.5 SP1 と VS2008 を使用しています

編集

@Richard Beier の提案に従って、System.Netトレースを試みました。トレースをオンにすると、正常にWebRequest失敗します。ただし、トレースをオフにするとすぐに、動作は予期しない成功に戻ります。以前と同じマシンで、デバッグ モードとリリース モードの両方でこれを再現しました。

編集 2

これは、問題を引き起こしている会社のプロキシであることが判明しました。私たちのソリューションは、"bing.com" が既定のプロキシではなく DIRECT を指す、テスト マシン用のカスタム プロキシ構成スクリプトでした。

4

3 に答える 3

7

@Hans Passant がここで問題を発見したと思います。IE でプロキシを設定しているようです。

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

これは、OS にwww.bing.comの IP アドレスを取得するように要求しているためです。

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

フレームワークにサーバー名からパスを取得するように要求しているため、これは機能します。フレームワークは IE フロントエンドが使用するものと同じエンジンと設定を使用するため、会社が会社のプロキシ サーバーを使用することを GPO で指定している場合、あなたではなくwww.bing.comの IP アドレスを解決するのはそのプロキシ サーバーです。

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

フレームワークに特定のサーバーから (IP によって) Web ページをフェッチするように要求したため、これは機能します/失敗します。プロキシ セットがある場合でも、このプロキシはこの IP アドレスに接続できません。

これが役立つことを願っています。

ジョナサン

于 2010-08-14T11:38:08.087 に答える
3

Windows7でVS2010を使用していますが、これを再現できません。同じhosts-fileを変更し、次のコードを実行しました。

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トレースをオンにします

  • Dns.GetHostAddresses()を使用して問題をIPに解決することにより、問題を回避します。次に、IPをURLに入力します(例:「http://10.0.0.1/」)。しかし、それはあなたにとって選択肢ではないかもしれません。

上記のスレッドで、mariyaatanasova_msftは次のようにも述べています。「HttpWebRequestはDns.GetHostEntryを使用してホストを解決するため、Dns.GetHostAddressesとは異なる結果が得られる可能性があります」。

于 2010-08-14T07:15:13.040 に答える
0

デフォルトのプロキシを上書きする必要があります。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
}
于 2016-03-18T17:13:56.793 に答える