有没有办法获得System.Net.WebRequest
or System.Net.WebClient
尊重hosts
or lmhosts
file?
例如:在我的主机文件中,我有:
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
Edit
根据@Richard Beier的建议,我尝试了System.Net
追踪。有追踪ON the WebRequest
失败了,正如它应该的那样。然而,一旦我转向追踪OFF行为会恢复到意外的成功。我已经在调试和发布模式下在与以前相同的机器上重现了这一点。
Edit 2
事实证明,这是公司代理给我们带来的问题。我们的解决方案是为我们的测试机器定制代理配置脚本,其中“bing.com”指向 DIRECT 而不是默认代理。
我认为@Hans Passant 已经发现了这里的问题。看来您在 IE 中设置了代理。
Dns.GetHostAddresses("www.bing.com")[0]; // 10.0.0.1
这是有效的,因为您要求操作系统获取 IP 地址www.bing.com http://www.bing.com
WebRequest.Create("http://www.bing.com/").GetResponse(); // unexpectedly succeeds
这是有效的,因为您要求框架从服务器名称获取路径。该框架使用与 IE 前端相同的引擎和设置,因此,如果您的公司已通过 GPO 指定您使用公司代理服务器,则该代理服务器将解析 IP 地址www.bing.com http://www.bing.com而不是你。
WebRequest.Create("http://10.0.0.1").GetResponse(); // throws exception (expected)
此方法有效/失败,因为您已要求框架从特定服务器(通过 IP)获取网页。即使您设置了代理,该代理仍然无法连接到该 IP 地址。
我希望这个对你有用。
Jonathan
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)