.NET代理检测

我遇到.NET检测通过Internet Explorer配置的代理设置的问题。

我正在编写一个支持代理的客户端应用程序,并测试我设置了一个包含9个squid服务器的数组,以支持HTTP和HTTP的各种身份validation方法。 我有一个脚本,可以将IE更新为我选择的任何配置(哪个代理,通过“Auto”,PAC或硬编码进行检测)。

我已经尝试了以下3种方法来通过.NET检测IE配置。 在我看来,我发现.NET选择了错误的代理服务器集。 IE有正确的设置,如果我用IE浏览网页,我可以看到我通过wireshark击中了正确的服务器。

WebRequest.GetSystemWebProxy().GetProxy(destination);

GlobalProxySelection.Select.GetProxy(destination);

WebRequest.DefaultWebProxy

以下是我的提示:

  • 我的脚本在Web服务器上设置PAC文件,并在IE中更新配置,然后清除IE的缓存
  • .NET似乎“卡在”某个代理配置上,我必须为.NET设置另一个配置以实现更改。 偶尔它似乎会选择一些随机服务器(我确定它们不是随机的,只是我曾经使用过的一组服务器,并且在一些缓存的PAC文件中)。 在中,我将检查目的地“https://www.secure.com”的代理,我可能已配置IE,因此期望得到“http:// squidserver:18”而它将返回“http” :// squidserver:28“(端口18运行NTLM,28运行没有身份validation)。 所有的鱿鱼服务器都有效。
  • 这似乎不是XP上的问题,只有Vista,2003和Windows 7。
  • 在IE中硬编码代理服务器总是有效
  • 时间总能解决问题 – 如果我离开计算机大约20或30分钟并回来,.NET会选择正确的代理设置,就好像缓存的PAC脚本已过期一样。

我找到了解决方案。

.NET使用“WinHttp Web代理自动发现服务”来执行PAC脚本执行,并可能缓存结果。 只需停止并重新启动此服务即可。 以下命令行为我执行此操作。

 NET STOP WinHttpAutoProxySvc NET START WinHttpAutoProxySvc 

http://wiki.blackviper.com/wiki/WinHTTP_Web_Proxy_Auto-Discovery_Service

我通过遵循James Kovacs关于附加调试器的建议找到了这个。 我已经反映了代码,并且在我发布问题之前尝试连接调试器失败了,但无法解释究竟发生了什么。 耗尽了选项,我再次尝试调试,几个小时后在第76行的_AutoPWebProxyScriptEngine.cs中发现了以下注释,这引发了我的发现

  // In Win2003 winhttp added a Windows Service handling the auto-proxy discovery. In XP using winhttp // APIs will load, compile and execute the wpad file in-process. This will also load COM, since // WinHttp requires COM to compile the file. For these reasons, we don't use WinHttp on XP, but // only on newer OS versions where the "WinHTTP Web Proxy Auto-Discovery Service" exists. 

我有同样的问题,我成功地在注册表中获取/设置代理设置:

 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings] "ProxyServer"="<your proxy IP address>:8080" "ProxyEnable"=dword:00000001 "ProxyOverride"="<local>"