有没有办法让 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
跟踪。跟踪 ON WebRequest
应该会失败。然而,一旦我打开跟踪 OFF,行为就会恢复到意外的成功。我已经在调试和 Release模式下在与以前相同的机器上重现了这一点。
编辑2
原来是公司代理给我们出了问题。我们的解决方案是为我们的测试机器定制代理配置脚本,其中“bing.com”指向 DIRECT 而不是默认代理。
最佳答案
我认为@Hans Passant 已经发现了这里的问题。看起来您在 IE 中设置了代理。
Dns.GetHostAddresses("www.bing.com")[0]; // 10.0.0.1
这是可行的,因为您要求操作系统获取 www.bing.com 的 IP 地址
WebRequest.Create("http://www.bing.com/").GetResponse(); // unexpectedly succeeds
这是可行的,因为您要求框架从服务器名称中获取路径。该框架使用与 IE 前端相同的引擎和设置,因此如果您的公司已通过 GPO 指定您使用公司代理服务器,则该代理服务器会解析 www.bing.com 的 IP 地址。而不是你。
WebRequest.Create("http://10.0.0.1").GetResponse(); // throws exception (expected)
这有效/失败,因为您已要求框架从特定服务器(通过 IP)为您获取网页。即使您设置了代理,此代理仍无法连接到此 IP 地址。
希望对您有所帮助。
乔纳森
关于c# - System.Net.WebRequest 不考虑主机文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3480545/