2011-02-04 2 views
6

У меня есть код, который отлично работает, когда у меня есть прокси-сервер, определенный в 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 на если заявление линии.

UPDATE 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

+2

Знаете ли вы, что WebProxy.GetDefaultProxy() считается устаревшим? Вместо этого вы должны использовать WebRequest.GetSystemWebProxy() или WebRequest.DefaultWebProxy. –

+0

Я обновил свой вопрос, чтобы использовать 'GetSystemWebProxy'. Все еще имея проблемы, не могли бы вы взглянуть? –

ответ

10

Помните, что нет ни одного «прокси-адреса» или прокси-сервера Uri, как вы думаете. Вместо этого прокси-сервер Uri может зависеть от каждого получаемого Uri, как это видно в диалоговом окне настроек прокси-сервера Internet Explorer.

Internet Explorer - Proxy Settings dialog

Интерфейс IWebProxy поможет вам получить правильный прокси 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

Примечание. Не следует вызывать «IWebProxy.IsBypassed()» и «IWebProxy.GetProxy()» и ожидать, что результат будет согласованным, поскольку настройки могут меняться между вызовами. (Особенно, если это происходит из 'WebRequest.GetSystemWebProxy()'.) [Комментировать разделение из-за длинных URL-адресов ...] – antak

+0

Если требуется вызов GetProxy() ', только способ безопасного определения, следует ли прокси-серверу обойти представляется [путем сравнения полученного URI], чтобы убедиться, что он совпадает с исходным Uri] (https://referencesource.microsoft.com/#system/net/System/Net/webproxy.cs 598). (например, 'isBypassed = (webProxy.GetProxy (uri) == uri')) Это, однако, [вообще не зарегистрировано] (https://msdn.microsoft.com/en-us/library/system.net.iwebproxy .getproxy (v = vs.110) .aspx). – antak

+1

@antak Вы правы. Хотя описанная проблема кажется мне немного академической, поскольку настройки прокси-сервера обычно не меняются постоянно, особенно не каждый мсек. ;) Поэтому для большинства распространенных случаев должно быть хорошо. – oleschri

0

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

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

Да, я думал об этом, но я не уверен, как настроить WebClient без прокси. Есть идеи? –

0

Вы можете использовать отладчик и поставить точку останова, если заявление?

Если я прав, звонок WebProxy.GetDefaultProxy() будет возвращать null и, следовательно, NullReferenceException.

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

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

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

+0

Я пытаюсь теперь не использовать 'WebProxy.GetDefaultProxy()', поскольку он был отмечен как устаревший с V1. Я хочу использовать что-то вроде «IWebProxy iwp = WebRequest.GetSystemWebProxy()». Любые идеи о том, как проверить наличие прокси-сервера, используя это? –

+0

Просто попробуйте назвать его без настройки прокси. Я ожидаю, что iwp будет пустым, или будет выбрано исключение. – JochemKempe

+0

Мое предположение было неправильным, iwp не является ни null, ни исключение не будет выбрано. Можно ли проверить iwp.IsBypassed (Uri uri) для вашего целевого uri? – JochemKempe