我有一个非常奇怪的情况在这里:我写一个应用程序,除其他外,从开到关和其他方式轮开关连接代理。 它是通过更改注册表中的值来完成:
public void SetUpProxy(string proxy, bool enable)
{
RegistryKey key = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
if (proxy != null)
key.SetValue("ProxyServer", proxy);
key.SetValue("ProxyEnable", enable ? 1 : 0);
key.Close();
}
当我要求它使代理在我的应用它做的第一件事是连接到FTP服务器,下载一个文件,然后启用代理(下载不会与代理上工作)。 一切都运行完美 - 直到我启动Internet Explorer。
例如:如果我开始我的应用程序,让它启用代理,然后让它禁用代理 - 一切工作正常。 但是,如果我启用代理, 然后启动IE浏览器 ,禁用代理,并尝试启用一遍它不工作-该应用程序无法连接到FTP服务器,因为不知它使用代理,即使在注册表中的值是0!
我希望我设法正确地解释它。 我的问题是:为什么会发生的事情,我怎么能解决这个问题?
编辑:我使用WebClient类下载文件。 我发现,client.Proxy.GetProxy(myUri)时THA应用程序运行正常返回指定的URI,butwhen我打开IE它更改为“ HTTP:// theUriFromIE ”。
在我自己的测试,我得出的结论是,网络连接设置是,至少在Windows XP中,每个Internet Explorer正在重新加载时间重载。
因此,要在加载的代理服务器设置的变化,你必须关闭所有IE,并重新打开至少一个实例,让加载的设置。
不知道是不是在Windows Vista上使用新的方式是即时的。
另外,看这个的其他问题 :
这一定程度上取决于您的实际需要。 如果你正在写一个C#应用程序,只是想设置您的应用程序将使用默认的代理设置,使用类System.Net.GlobalProxySelection 。 您还可以设置代理服务器与任何特定连接System.Net.WebProxy 。
如果你真的想更新注册表中的代理服务器设置,我认为你需要使用P / Invoke来调用WinAPI的功能WinHttpSetDefaultProxyConfiguration 。
你也有这样的微软如何以编程方式查询和在Internet Explorer中设置代理服务器设置 。
我假设你正在使用的FtpWebRequest,具有.Proxy财产,这反过来又一个.IsBypassed属性。 您可以通过此属性设置为False(而非写入注册表)做你想做的,因而可以通过任何与IE发生影响。
更新 :呃,我的意思是集IsBypassed为True(使代理被绕过,我认为这是你想要的)。
更新2:这里是另一种猜测。 尝试把这个在你的应用程序的配置文件,然后重新编译:
<configuration>
<system.net>
<defaultProxy>
<proxy autoDetect="false" />
</defaultProxy>
</system.net>
</configuration>
自动检测属性决定你的应用程序是否拿起IE代理设置,因此它设置为false可能会阻止你的问题。
简单设置Web客户端的代理属性设置为null帮助。
写入注册表,直接可能发生的工作,但它不支持,并不会立即生效。
要正确设置代理服务器,你应该调用的WinINET的InternetSetOption API。
if (InternetSetOptionList((IntPtr)0, INTERNET_OPTION_PER_CONNECTION_OPTION, ref Request, size))
{
// Success. Announce to the world that we've changed the proxy
InternetSetOption((IntPtr)0, INTERNET_OPTION_PROXY_SETTINGS_CHANGED, (IntPtr)0, 0);
}
作为EricLaw指出,正确的做法是要经过WININET库。
稍微修改是我用我的C ++应用程序告诉IE浏览器重新加载它的代码是代理设置:
// ... code changing registry settings...
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
InternetSetOption(NULL, INTERNET_OPTION_REFRESH, NULL, 0);
通过wininet.h去,我从来没有见过任何引用
INTERNET_OPTION_PROXY_SETTINGS_CHANGED
被定义,所以不知道是哪里来的。
我已经使用了下面UDPATE 2.它的工作。 感谢所有。
更新2:这里是另一种猜测。 尝试把这个在你的应用程序的配置文件,然后重新编译: