2011-02-04 31 views
6

Tengo un código que funciona bien cuando tengo un proxy web definido en Internet Explorer. Sin embargo, si no hay ninguno definido, no funciona. Quiero verificar si el proxy a está definido. ¿Cómo cambiaría el código a continuación para hacer eso?¿Cómo verificar si un servidor proxy está configurado?

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

Por ejemplo, ¿cómo puedo descargar los datos sin usar un proxy?

ACTUALIZACIÓN

me han cambiado el código a la siguiente

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

me sale el siguiente error System.NullReferenceException was unhandled by user code en la línea de sentencia if.

ACTUALIZACIÓN 2

También he intentado cambiar esta línea:

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

a

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

pero me sale este error:

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

¿Alguna idea?

+0

Sin un proxy: ¿omitiría 'wc.Proxy = wp;' hacer el truco? ("si no hay proxy, no lo configure") – Piskvor

+2

¿Sabía que WebProxy.GetDefaultProxy() se considera obsoleto? Debería usar WebRequest.GetSystemWebProxy() o WebRequest.DefaultWebProxy en su lugar. –

+0

He actualizado mi pregunta para usar 'GetSystemWebProxy'. Aún teniendo problemas, ¿podrías echarle un vistazo? –

Respuesta

10

Recuerde, no hay una sola "dirección proxy" o proxy Uri como podría pensar. En cambio, el URI proxy puede depender de cada URI que se recuperará, como se puede ver en el cuadro de diálogo Configuración de Proxy de Internet Explorer.

Internet Explorer - Proxy Settings dialog

La interfaz IWebProxy le ayuda a obtener el derecho de representación Uri, y le indica si este proxy será utilizada o desviado para un URI específico para ser recuperado.

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 

En su método, debería pasar una interfaz IWebProxy, no una dirección proxy. La interfaz proxy predeterminada (como desde GetSystemWebProxy) siempre se establece como predeterminada.

Si desea establecer su propio proxy especial en caso de que no se utilice un proxy para su Uri, podría hacer lo siguiente ...

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: No se deben llamar tanto 'IWebProxy.IsBypassed()' y 'IWebProxy.GetProxy()' y se espera que el resultado sea coherente, ya que la configuración puede cambiar entre las llamadas. (Especialmente si proviene de 'WebRequest.GetSystemWebProxy()'.) [División de comentarios debido a largas URL ...] – antak

+0

Si se requiere una llamada a 'GetProxy()', única forma de determinar con seguridad si el proxy debe ser pasado por alto parece ser por [comparando el 'Uri' resultante para ver si es el mismo que el Uri original] (https://referencesource.microsoft.com/#system/net/System/Net/webproxy.cs,598). (por ejemplo, 'isBypassed = (webProxy.GetProxy (uri) == uri')) Esto sin embargo [no está documentado en absoluto] (https://msdn.microsoft.com/en-us/library/system.net.iwebproxy .getproxy (v = vs.110) .aspx). – antak

+1

@antak Tienes razón. Aunque el problema descrito parece un poco académico para mí ya que la configuración del proxy por lo general no cambia todo el tiempo, especialmente no cada mseg. ;) Entonces, para la mayoría de los casos comunes, uno debería estar bien. – oleschri

0

Sólo tiene que llamar

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

Sí, pensé en hacer eso, pero no estoy seguro de cómo configurar el WebClient sin proxy. Alguna idea allí? –

0

¿Se puede utilizar el depurador y poner un punto de interrupción en la instrucción if?

Si estoy en lo cierto, la llamada WebProxy.GetDefaultProxy() devolverá nulo y, por lo tanto, NullReferenceException.

¿Qué pasa si cambia el código para:

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

creo que debería resolver su problema.

+0

Estoy intentando ahora no usar 'WebProxy.GetDefaultProxy()' ya que se ha marcado como obsoleto desde V1. Quiero usar algo como 'IWebProxy iwp = WebRequest.GetSystemWebProxy()'. ¿Alguna idea sobre cómo probar la existencia de un proxy usando eso? –

+0

Solo intenta llamar sin un proxy configurado. Espero que iwp sea nulo, o se lanzará una excepción. – JochemKempe

+0

Mi suposición no era correcta, iwp no es nulo ni se lanzará una excepción. Sin embargo, es posible comprobar iwp.IsBypassed (Uri uri) para su uri objetivo, creo? – JochemKempe

Cuestiones relacionadas