如何检查是否配置了代理服务器?

时间:2011-02-04 13:12:16

标签: c# c#-4.0 proxy

当我在Internet Explorer中定义Web代理时,我有一些运行正常的代码。但是,如果没有定义则不起作用。我想检查是否定义了代理。如何更改以下代码呢?

public DataTable GetCurrentFxPrices(string url)
{
    WebProxy wp = new WebProxy(WebProxy.GetDefaultProxy().Address.AbsoluteUri, true);
    wp.Credentials = CredentialCache.DefaultCredentials;

    WebClient wc = new WebClient();
    wc.Proxy = wp;

    MemoryStream ms = new MemoryStream(wc.DownloadData(url));
    DataSet ds = new DataSet("fxPrices");
    ds.ReadXml(ms);

    DataTable dt = ds.Tables["Rate"];
    int i = dt.Rows.Count;
    return dt;
}

例如,如何在不使用代理的情况下下载数据?

更新

我已将代码更改为以下

public DataTable GetCurrentFxPrices(string url)
{
    WebClient wc = new WebClient();

    if (!String.IsNullOrEmpty(WebProxy.GetDefaultProxy().Address.AbsoluteUri))
    {
        WebProxy wp = new WebProxy(WebProxy.GetDefaultProxy().Address.AbsoluteUri, true);
        wp.Credentials = CredentialCache.DefaultCredentials;
        wc.Proxy = wp;
    }            

    MemoryStream ms = new MemoryStream(wc.DownloadData(url));
    DataSet ds = new DataSet("fxPrices");
    ds.ReadXml(ms);
    DataTable dt = ds.Tables["Rate"];

    int i = dt.Rows.Count;
    return dt;
}

我在if语句行上收到以下错误System.NullReferenceException was unhandled by user code

更新2

我也试过改变这一行:

if (!String.IsNullOrEmpty(WebProxy.GetDefaultProxy().Address.AbsoluteUri))

if (WebProxy.GetDefaultProxy().Address.AbsoluteUri != null)

但是我收到了这个错误:

System.NullReferenceException: Object reference not set to an instance of an object.

有什么想法吗?

3 个答案:

答案 0 :(得分:10)

请记住,您可能没有一个单独的“代理地址”或代理Uri。相反,代理Uri可能依赖于要检索的每个Uri,如Internet Explorer的代理设置对话框中所示。

Internet Explorer - Proxy Settings dialog

IWebProxy接口可帮助您获取正确的代理Uri,并告诉您是否将使用或绕过此代理以检索特定的Uri。

using System.Net;

Uri exampleUri = new Uri("http://www.example.org/")

IWebProxy defaultProxy = WebRequest.GetSystemWebProxy();

bool isBypassed = defaultProxy.IsBypassed(exampleUri);
// ... false

Uri proxyUri = defaultProxy.GetProxy(exampleUri);
// ... http://someproxy.mycorp.example:8080

在您的方法中,您必须传递IWebProxy接口,而不是代理地址。默认代理接口(例如来自GetSystemWebProxy)始终设置为默认值。

如果您想设置自己的特殊代理,以防Uri没有使用代理,您可以执行以下操作...

public DataTable GetCurrentFxPrices(string url)
{
    Uri uri = new Uri(url);

    WebClient webClient = new WebClient();
    IWebProxy defaultProxy = WebRequest.GetSystemWebProxy();

    IWebProxy myProxy = new WebProxy(new Uri("http://myproxy:8080"))
    // if no bypass-list is specified, all Uris are to be retrieved via proxy

    if (defaultProxy.IsBypassed(uri))
    {
        myProxy.Credentials = CredentialCache.DefaultCredentials;
        webClient.Proxy = myProxy;
    }            

    MemoryStream ms = new MemoryStream(webClient.DownloadData(url));
    DataSet ds = new DataSet("fxPrices");
    ds.ReadXml(ms);
    DataTable dt = ds.Tables["Rate"];

    int i = dt.Rows.Count;
    return dt;
}

答案 1 :(得分:0)

致电

if(!String.IsNullOrEmpty(WebProxy.GetDefaultProxy().Address.AbsoluteUri))
{ 
    //do something you want if proxy is set
}
else
{
    //something else(proxy not set)
}

答案 2 :(得分:0)

您可以使用调试器并在if语句上添加断点吗?

如果我是正确的,WebProxy.GetDefaultProxy()调用将返回null,因此返回NullReferenceException

如果您将代码更改为:

会发生什么
if ((WebProxy.GetDefaultProxy() != null) && (!String.IsNullOrEmpty(WebProxy.GetDefaultProxy().Address.AbsoluteUri)))

我认为它应该可以解决你的问题。