2011-02-04 117 views
6

我有一些运行良好的代码,当我在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; 
} 

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

UPDATE

我已经改变了代码以下

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

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

更新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.

任何想法?

+0

没有代理:会省略`wc.Proxy = wp;`做窍门吗? (“如果没有代理,请不要设置它”) – Piskvor 2011-02-04 13:15:59

+2

您知道WebProxy.GetDefaultProxy()被认为已过时吗?您应该改用WebRequest.GetSystemWebProxy()或WebRequest.DefaultWebProxy。 – 2011-02-04 13:47:38

+0

我更新了我的问题以使用`GetSystemWebProxy`。仍然有麻烦,你能看看吗? – 2011-02-09 15:00:50

回答

10

请记住,没有一个单一的“代理地址”或代理Uri如您所想。相反,代理Uri可能依赖每个Uri进行检索,这可以在Internet Explorer的“代理设置”对话框中看到。

Internet Explorer - Proxy Settings dialog

的IWebProxy界面可以帮助您得到正确的代理服务器开放的,并告诉你,如果这个代理会被使用或者绕过一个特定的URI进行检索。

​​

在您的方法中,您必须传递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; 
} 
0

只需拨打

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

你可以使用调试器,把一个断点if语句?

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

,如果你的代码更改,会发生什么:

if ((WebProxy.GetDefaultProxy() != null) && (!String.IsNullOrEmpty(WebProxy.GetDefaultProxy().Address.AbsoluteUri))) 

我认为它应该解决您的问题。