c# - System.Net.WebRequest 不考虑主机文件

标签 c# .net hosts

有没有办法让 System.Net.WebRequestSystem.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/

相关文章:

c# - 日期时间格式问题 : String was not recognized as a valid DateTime

c# - DispatcherTimer 不触发

c# - 如何在 C# 中查找打印机类型?

c# - 'GET OR SET ACCESSOR EXPECTED' 是什么意思?

.net - 是否有用于保存文件系统路径的类?

python - python 脚本的备用主机/IP

windows-7 - Windows 批处理 : How to add Host-Entries?

javascript - Grunt 服务器如何正确设置主机名和虚拟主机?

c# - IsMouseCaptured 变为 False

c# - 如何过滤 ObjectListView 中的多个子项