当我在 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:对象引用未设置为对象的实例。
有什么想法吗?
最佳答案
请记住,并不像您想象的那样只有一个“代理地址”或代理 Uri。相反,代理 Uri 可能取决于要检索的每个 Uri,如 Internet Explorer 的代理设置对话框中所示。
IWebProxy 接口(interface)可帮助您获取正确的代理 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 接口(interface),而不是代理地址。默认代理接口(interface)(如来自 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;
}
关于c# - 如何查看是否配置了代理服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4898339/