c# - 如何查看是否配置了代理服务器?

标签 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:对象引用未设置为对象的实例。

有什么想法吗?

最佳答案

请记住,并不像您想象的那样只有一个“代理地址”或代理 Uri。相反,代理 Uri 可能取决于要检索的每个 Uri,如 Internet Explorer 的代理设置对话框中所示。

Internet Explorer - Proxy Settings dialog

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/

相关文章:

c# - 删除文件时我的代码出错?

c# - 压缩图像比 Bitmap.save C# 更快

c# - 如何在 c# 上将 asp.net 用户控件的当前类名转换为字符串?

c# - 如何合并 3 个关节并将图像叠加到其上,以便图像旋转

internet-explorer - 如何使用 powershell 应用更改的代理设置 (AutoConfigURL)

docker - 使用 Traefik 2 作为 MariaDB (Docker) 的 TCP 代理

C# TCP异步连接主动拒绝CPU利用率低

unit-testing - MSTest 内存不足异常

php - 如何将 https 源的下载传递到 http 连接?

c# - 如何将 Entity Framework 查询结果放入列表