我有一个非常奇怪的情况:我写了一个应用程序,除其他外,将连接的代理从开启切换到关闭,反之亦然。它是通过更改注册表中的值来完成的:
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)在应用程序正常运行时返回指定的Uri,但是当我打开IE时,它会变为“http://theUriFromIE”。
答案 0 :(得分:1)
根据我自己的测试,我得出的结论是,每次重新加载Internet Explorer时,至少在Windows XP上都会重新加载网络连接设置。
因此,要对加载的代理设置进行更改,您必须关闭所有IE实例,并重新打开至少一个实例,以便加载设置。
不知道Windows Vista上的新方式是否是即时的。
另外,请查看this other question:
这在某种程度上取决于您的确切需求。如果您正在编写C#应用程序并且只想设置应用程序将使用的默认代理设置,请使用课程System.Net.GlobalProxySelection。您还可以使用System.Net.WebProxy为任何特定连接设置代理。
如果您确实想要更新注册表中的代理设置,我相信您需要使用P / Invoke来调用WinAPI函数WinHttpSetDefaultProxyConfiguration。
您还有Microsoft How to programmatically query and set proxy settings under Internet Explorer。
答案 1 :(得分:1)
我假设您正在使用FtpWebRequest,它具有.Proxy属性,该属性又具有.IsBypassed属性。您可以通过将此属性设置为False(而不是写入注册表)来执行您想要的操作,因此不会受到IE发生的任何事情的影响。
更新:呃,我的意思是将IsBypassed设置为True(以便绕过代理,我认为这就是你想要的)。
更新2 :这是另一个猜测。尝试将其放入应用程序的配置文件中,然后重新编译它:
<configuration>
<system.net>
<defaultProxy>
<proxy autoDetect="false" />
</defaultProxy>
</system.net>
</configuration>
autoDetect属性确定您的应用是否选择了IE代理设置,因此将其设置为false可能会阻止您的问题。
答案 2 :(得分:1)
简单地将WebClient的Proxy属性设置为null有帮助。
答案 3 :(得分:0)
直接写入注册表可能会起作用,但它不受支持,并且不会立即生效。
要正确设置代理,您应该在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);
}
答案 4 :(得分: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
被定义,因此不确定它来自何处。
答案 5 :(得分:-3)
我使用了下面的udpate 2.它的工作原理。谢谢大家。
更新2:这是另一个猜测。尝试将其放入应用程序的配置文件中,然后重新编译它:
<强>