有没有办法获得System.Net.WebRequest或System.Net.WebClient尊重hosts或lmhosts文件?
例如:在我的主机文件中,我有:
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文件?
附加信息:
编辑
根据@Richard Beier的建议,我尝试了System.Net追踪.随着跟踪ON的WebRequest失败,因为它应该.但是,只要我将跟踪关闭,行为就会恢复到意外的成功.我在调试和发布模式下都在同一台机器上重现了这一点.
编辑2
事实证明这是公司代理给我们带来的问题.我们的解决方案是我们的测试机器的自定义代理配置脚本,其中"bing.com"指向DIRECT而不是默认代理.
我认为@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地址.
我希望这个对你有用.
乔纳森