当我在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.
有什么想法吗?
答案 0 :(得分:10)
请记住,您可能没有一个单独的“代理地址”或代理Uri。相反,代理Uri可能依赖于要检索的每个Uri,如Internet Explorer的代理设置对话框中所示。
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)))
我认为它应该可以解决你的问题。