C#自动检测代理设置

ant*_*009 23 c# proxy networking

C#2008 SP1

我正在使用代码来检测是否已在"Internet选项"下设置代理.如果有代理,那么我将在我的webclient中设置它.

所以我只是检查代理的地址是否存在.如果没有,那么在webclient中没有设置代理.

这是正确的方法:

非常感谢任何建议,

WebProxy proxy = WebProxy.GetDefaultProxy();

if (proxy.Address.ToString() != string.Empty)
{
    Console.WriteLine("Proxy URL: " + proxy.Address.ToString());
    wc.Proxy = proxy;
}
Run Code Online (Sandbox Code Playgroud)

======代码编辑======

[DllImport("wininet.dll", CharSet = CharSet.Auto)]
private extern static bool InternetGetConnectedState(ref InternetConnectionState_e lpdwFlags, int dwReserved);

[Flags]
enum InternetConnectionState_e : int
{
    INTERNET_CONNECTION_MODEM = 0x1,
    INTERNET_CONNECTION_LAN = 0x2,
    INTERNET_CONNECTION_PROXY = 0x4,
    INTERNET_RAS_INSTALLED = 0x10,
    INTERNET_CONNECTION_OFFLINE = 0x20,
    INTERNET_CONNECTION_CONFIGURED = 0x40
}     

// Return true or false if connecting through a proxy server
public bool connectingThroughProxy()
{
    InternetConnectionState_e flags = 0;
    InternetGetConnectedState(ref flags, 0);
    bool hasProxy = false;

    if ((flags & InternetConnectionState_e.INTERNET_CONNECTION_PROXY) != 0)
    {
        hasProxy = true;
    }
    else
    {
        hasProxy = false;
    }

    return hasProxy;
}
Run Code Online (Sandbox Code Playgroud)

小智 27

似乎WebRequest.DefaultWebProxy是WebProxy.GetDefaultProxy 的官方替代品.

只需稍加修改,您就可以将其放入原始代码中.就像是:

WebProxy proxy = (WebProxy) WebRequest.DefaultWebProxy;
if (proxy.Address.AbsoluteUri != string.Empty)
{
    Console.WriteLine("Proxy URL: " + proxy.Address.AbsoluteUri);
    wc.Proxy = proxy;
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现这给了我一个类转换异常,因为WebRequest.DefaultWebProxy正在返回一个WebProxyWrapper.不幸的是,在我的情况下,WebProxyWrapper让我无法访问底层的WebProxy对象,这是令人沮丧的,因为我试图调试的代码似乎没有在实时环境中应用代理,而是在开发环境中这样做. (15认同)
  • 你提供的演员实际上抛出了InvalidCastException!无法将"WebProxyWrapper"类型的对象强制转换为"System.Net.WebProxy". (8认同)
  • 我也有同样的问题.我设法使用以下方法获取Web代理的URI:**Uri uriProxy = WebRequest.DefaultWebProxy.GetProxy(new Uri("http:// someserver.com"));** (5认同)

Mat*_*hen 5

首先,GetDefaultProxy被标记为已弃用,因此您无法保证即使在不久的将来它也会存在。其次,地址可以为空,因此您提供的代码可能会引发 NullReferenceException:


Mar*_*ell 5

WebClient等使用WinHTTP设置(不是IE设置),所以最简单的方法是配置WinHTTP!在XP等上你可以使用:

proxycfg -u
Run Code Online (Sandbox Code Playgroud)

将当前IE设置导入WinHTTP存储.之后,WebClient等应该能够使用相同的设置而不会出现问题.在Vista和Windows 7上,现在可以在以下位置找到:

netsh winhttp import proxy ie
Run Code Online (Sandbox Code Playgroud)

您需要以管理员身份运行它.


Spe*_*pin 5

这对我有用

        var proxy = WebRequest.GetSystemWebProxy();
        Uri testUrl = new Uri("http://proxy.example.com");
        var proxyUrl = proxy.GetProxy(testUrl);
        if (proxyUrl != testUrl)
            //Use your proxy here
        else
            //We are not using a proxy
Run Code Online (Sandbox Code Playgroud)