System.Net.WebRequest不尊重主机文件

Nat*_*ate 9 .net c# hosts

有没有办法获得System.Net.WebRequestSystem.Net.WebClient尊重hostslmhosts文件?

例如:在我的主机文件中,我有:

10.0.0.1  www.bing.com
Run Code Online (Sandbox Code Playgroud)

当我尝试在浏览器(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
Run Code Online (Sandbox Code Playgroud)

同理:

WebClient wc = new WebClient();
wc.DownloadString("http://www.bing.com"); //succeeds 
Run Code Online (Sandbox Code Playgroud)

为什么要System.Net.Dns尊重hosts文件却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追踪.随着跟踪ONWebRequest失败,因为它应该.但是,只要我将跟踪关闭,行为就会恢复到意外的成功.我在调试和发布模式下都在同一台机器上重现了这一点.

编辑2

事实证明这是公司代理给我们带来的问题.我们的解决方案是我们的测试机器的自定义代理配置脚本,其中"bing.com"指向DIRECT而不是默认代理.

Jon*_*ton 7

我认为@Hans Passant在这里发现了这个问题.看起来你在IE中有一个代理设置.

Dns.GetHostAddresses("www.bing.com")[0]; // 10.0.0.1  
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为您要求操作系统获取www.bing.com的IP地址

WebRequest.Create("http://www.bing.com/").GetResponse(); // unexpectedly succeeds
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为您要求框架从服务器名称获取路径.该框架使用IE前端使用的相同引擎和设置,因此如果您的公司已通过GPO指定您使用公司代理服务器,那么代理服务器将解析www.bing.com而不是您的IP地址.

WebRequest.Create("http://10.0.0.1").GetResponse(); // throws exception (expected) 
Run Code Online (Sandbox Code Playgroud)

这工作/失败是因为您已要求框架从特定服务器(通过IP)获取网页.即使您有代理集,此代理仍然无法连接到此IP地址.

我希望这个对你有用.

乔纳森