質問

を取得する方法はありますか System.Net.WebRequest また 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.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

これは、私たちに問題を与える会社の代理であることが判明しました。私たちのソリューションは、デフォルトのプロキシの代わりに「bing.com」ポイントを備えたテストマシンのカスタムプロキシ構成スクリプトでした。

役に立ちましたか?

解決

@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

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

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

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

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

ジョナサン

他のヒント

Windows 7でVS 2010を使用していますが、これを再現することはできません。同じホストファイルの変更を行い、次のコードを実行しました。

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.gethostadressesから異なる結果を得ることができます」。

このスタックフローの答え .NET内でプロキシを無効にするためのQuick and Dirty構成があります。 web.configまたはapp.configとsystem.webに入れて、プロキシ構成を取得するために基礎となるシステムに目を向けません。

デフォルトのプロキシを上書きする必要があります。 httpwebrequest&webrequestは、インターネットエクスプローラーとファイルに存在する場合、デフォルトのプロキシを設定します ホスト そうなるでしょう バイパス.

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