System.net.WebRequestホストファイルを尊重しません
質問
を取得する方法はありますか 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
}