2011-02-04 1 views
6

Ho un codice che funziona bene quando ho un proxy Web definito in Internet Explorer. Tuttavia, se non è definito nessuno, non funziona. Voglio verificare se è definito un proxy. Come dovrei cambiare il codice qui sotto per farlo?Come verificare se un server proxy è configurato?

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; 
} 

Ad esempio, come posso scaricare i dati senza utilizzare un proxy?

UPDATE

ho cambiato il codice di seguito

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; 
} 

ottengo il seguente errore System.NullReferenceException was unhandled by user code sulla linea di se dichiarazione.

UPDATE 2

Ho anche provato a cambiare questa linea:

if (!String.IsNullOrEmpty(WebProxy.GetDefaultProxy().Address.AbsoluteUri))

a

if (WebProxy.GetDefaultProxy().Address.AbsoluteUri != null)

ma ottengo questo errore:

System.NullReferenceException: Object reference not set to an instance of an object.

Qualche idea?

+0

Senza un proxy: omettere 'wc.Proxy = wp;' fare il trucco? ("se non c'è proxy, non impostarlo") – Piskvor

+2

Sapevi che WebProxy.GetDefaultProxy() è considerato obsoleto? È necessario utilizzare WebRequest.GetSystemWebProxy() o WebRequest.DefaultWebProxy. –

+0

Ho aggiornato la mia domanda per utilizzare 'GetSystemWebProxy'. Hai ancora problemi, potresti dare un'occhiata? –

risposta

10

Ricordare che non esiste un solo "indirizzo proxy" o proxy Uri come si potrebbe pensare. Invece l'Uri del proxy può dipendere dal recupero di ogni Uri, come si può vedere nella finestra di dialogo Impostazioni proxy di Internet Explorer.

Internet Explorer - Proxy Settings dialog

L'interfaccia IWebProxy vi aiuta a ottenere il diritto di delega Uri, e ti dice se questo proxy verrà utilizzato o bypassato per una specifica Uri da recuperare.

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 

Nel metodo si dovrebbe passare un'interfaccia IWebProxy, non un indirizzo proxy. L'interfaccia proxy predefinita (come da GetSystemWebProxy) è sempre impostata come predefinita.

Se si desidera impostare il proprio proxy speciale nel caso in cui non sia utilizzato un proxy per l'Uri, è possibile effettuare le seguenti operazioni ...

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

Nota: non è necessario chiamare sia 'IWebProxy.IsBypassed()' che 'IWebProxy.GetProxy()' e si aspetta che il risultato sia coerente, poiché le impostazioni possono cambiare tra le chiamate. (Soprattutto se proviene da 'WebRequest.GetSystemWebProxy()'.) [Commento diviso a causa di lunghi URL ...] – antak

+0

Se è richiesta una chiamata a 'GetProxy()', l'unico modo per determinare in modo sicuro se il proxy deve essere ignorato sembra essere [confrontando l'Uri' risultante per vedere se è uguale all'URI originale] (https://referencesource.microsoft.com/#system/net/System/Net/webproxy.cs,598). (ad esempio 'isBypassed = (webProxy.GetProxy (uri) == uri')) Questo tuttavia [non è affatto documentato] (https://msdn.microsoft.com/en-us/library/system.net.iwebproxy .getproxy (v = vs.110) .aspx). – antak

+1

@antak Hai ragione. Anche se il problema descritto mi sembra un po 'accademico dal momento che le impostazioni del proxy di solito non cambiano tutto il tempo - specialmente non ogni msec. ;) Quindi per i casi più comuni si dovrebbe essere ok. – oleschri

0

Basta chiamare

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

Sì, ho pensato di farlo ma non sono sicuro di come configurare WebClient senza proxy. Qualche idea lì? –

0

è possibile utilizzare il debugger e mettere un punto di interruzione sulla istruzione if?

Se sono corretto, la chiamata WebProxy.GetDefaultProxy() restituirà null e quindi NullReferenceException.

Che cosa succede se si modifica il codice a:

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

Penso che dovrebbe risolvere il problema.

+0

Attualmente sto cercando di non utilizzare 'WebProxy.GetDefaultProxy()' poiché è stato contrassegnato come obsoleto dalla V1. Voglio usare qualcosa come 'IWebProxy iwp = WebRequest.GetSystemWebProxy()'. Qualche idea su come testare l'esistenza di un proxy che usa quello? –

+0

Basta provare a chiamarlo senza proxy configurato. Prevedo che iwp sia nullo, altrimenti verrà generata un'eccezione. – JochemKempe

+0

La mia ipotesi non era corretta, iwp non è nullo e non verrà lanciata un'eccezione. E 'comunque possibile controllare iwp.IsBypassed (Uri uri) per il tuo target uri penso? – JochemKempe