启用/禁用代理应用程序不与IE浏览器正常工作(Enabling/disabling proxy ap

2019-07-05 16:47发布

我有一个非常奇怪的情况在这里:我写一个应用程序,除其他外,从开到关和其他方式轮开关连接代理。 它是通过更改注册表中的值来完成:

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

Answer 1:

在我自己的测试,我得出的结论是,网络连接设置是,至少在Windows XP中,每个Internet Explorer正在重新加载时间重载。

因此,要在加载的代理服务器设置的变化,你必须关闭所有IE,并重新打开至少一个实例,让加载的设置。

不知道是不是在Windows Vista上使用新的方式是即时的。

另外,看这个的其他问题 :

这一定程度上取决于您的实际需要。 如果你正在写一个C#应用程序,只是想设置您的应用程序将使用默认的代理设置,使用类System.Net.GlobalProxySelection 。 您还可以设置代理服务器与任何特定连接System.Net.WebProxy 。

如果你真的想更新注册表中的代理服务器设置,我认为你需要使用P / Invoke来调用WinAPI的功能WinHttpSetDefaultProxyConfiguration 。

你也有这样的微软如何以编程方式查询和在Internet Explorer中设置代理服务器设置 。



Answer 2:

我假设你正在使用的FtpWebRequest,具有.Proxy财产,这反过来又一个.IsBypassed属性。 您可以通过此属性设置为False(而非写入注册表)做你想做的,因而可以通过任何与IE发生影响。

更新 :呃,我的意思是集IsBypassed为True(使代理被绕过,我认为这是你想要的)。

更新2:这里是另一种猜测。 尝试把这个在你的应用程序的配置文件,然后重新编译:

<configuration>
  <system.net>
    <defaultProxy>
      <proxy autoDetect="false" />
    </defaultProxy>
  </system.net>
</configuration>

自动检测属性决定你的应用程序是否拿起IE代理设置,因此它设置为false可能会阻止你的问题。



Answer 3:

简单设置Web客户端的代理属性设置为null帮助。



Answer 4:

写入注册表,直接可能发生的工作,但它不支持,并不会立即生效。

要正确设置代理服务器,你应该调用的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);
    }


Answer 5:

作为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 

被定义,所以不知道是哪里来的。



Answer 6:

我已经使用了下面UDPATE 2.它的工作。 感谢所有。

更新2:这里是另一种猜测。 尝试把这个在你的应用程序的配置文件,然后重新编译:



文章来源: Enabling/disabling proxy app doesn't work properly with IE