Как проверить, настроен ли прокси-сервер? - PullRequest
6 голосов
/ 04 февраля 2011

У меня есть код, который отлично работает, когда у меня есть веб-прокси, определенный в Internet Explorer. Однако, если ничего не определено, это не работает. Я хочу проверить, определен ли прокси. Как бы я изменил приведенный ниже код, чтобы сделать это?

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.

Есть идеи?

Ответы [ 3 ]

10 голосов
/ 21 февраля 2011

Помните, что нет ни одного "прокси-адреса" или прокси-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;
}
0 голосов
/ 16 февраля 2011

Можете ли вы использовать отладчик и поставить точку останова в операторе if?

Если я прав, вызов WebProxy.GetDefaultProxy() вернет ноль и, следовательно, NullReferenceException.

произойдет, если вы измените код на:

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

Я думаю, что это должно решить вашу проблему.

0 голосов
/ 04 февраля 2011

Просто позвоните

if(!String.IsNullOrEmpty(WebProxy.GetDefaultProxy().Address.AbsoluteUri))
{ 
    //do something you want if proxy is set
}
else
{
    //something else(proxy not set)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...