C#自动检测代理设置

时间:2009-05-10 01:00:53

标签: c# networking proxy

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;
}

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

[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;
}

8 个答案:

答案 0 :(得分:27)

似乎WebRequest.DefaultWebProxy是WebProxy.GetDefaultProxy的official replacement

只需稍加修改,您就可以将其放入原始代码中。类似的东西:

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

答案 1 :(得分:5)

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

proxycfg -u

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

netsh winhttp import proxy ie

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

尝试以下方法:

public string GetMeMyInfo(string searchCriteria)
{
    // Instatiate the web service and declare the necessary variables
    WsService.WsServiceBus oWsGetInfo = new WsService.WsServiceBus();
    // Configure the Web Service Proxy
    oWsGetInfo.Proxy = System.Net.WebProxy.GetDefaultProxy();
    oWsGetInfo.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
    // Invoke the web service
    return oWsGetInfo.GetInfo4Me(searchCriteria);
}

例如,在调用您的Web服务之前,它将获得默认代理设置和凭据。

答案 4 :(得分:2)

查看System.Net.Configuration.ProxyElement类。这可能包含您正在寻找的信息。

您描述的内容有效,您也可以查看注册表。

这是我写的用于检查代理的powershell脚本:

function get-proxy
{
    $path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
    $reg = get-itemproperty $path
    return $reg
}

答案 5 :(得分:2)

将我的请求代理设置为WebRequest.GetSystemWebProxy()解决了问题。

WebProxy.GetDefaultProxy()是实际的方式,但现已弃用。

答案 6 :(得分:2)

<system.net>
<defaultProxy enabled="false" useDefaultCredentials="false">
  <proxy/>
  <bypasslist/>
  <module/>
</defaultProxy>

在application.config文件中使用此代码段。

答案 7 :(得分:2)

这对我有用

        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