使用IE启用/禁用代理应用程序无法正常运行

时间:2009-09-08 12:25:20

标签: .net internet-explorer proxy

我有一个非常奇怪的情况:我写了一个应用程序,除其他外,将连接的代理从开启切换到关闭,反之亦然。它是通过更改注册表中的值来完成的:

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”。

6 个答案:

答案 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:这是另一个猜测。尝试将其放入应用程序的配置文件中,然后重新编译它:

<强>