2009-05-10 16 views
22

C# 2008 SP1C# detección automática de configuraciones proxy

Estoy usando el código para detectar si un proxy se ha configurado en "Opciones de Internet". Si hay un proxy, lo estableceré en mi webclient.

Así que solo estoy verificando si existe la dirección del proxy. Si no hay, entonces no hay un proxy para establecer en el webclient.

es esta la forma correcta de hacer esto:

Muchas gracias por cualquier consejo,

WebProxy proxy = WebProxy.GetDefaultProxy(); 

if (proxy.Address.ToString() != string.Empty) 
{ 
    Console.WriteLine("Proxy URL: " + proxy.Address.ToString()); 
    wc.Proxy = proxy; 
} 

Código ====== ====== edición

[DllImport("wininet.dll", CharSet = CharSet.Auto)] 
private extern static bool InternetGetConnectedState(ref InternetConnectionState_e lpdwFlags, int dwReserved); 

[Flags] 
enum InternetConnectionState_e : int 
{ 
    INTERNET_CONNECTION_MODEM = 0x1, 
    INTERNET_CONNECTION_LAN = 0x2, 
    INTERNET_CONNECTION_PROXY = 0x4, 
    INTERNET_RAS_INSTALLED = 0x10, 
    INTERNET_CONNECTION_OFFLINE = 0x20, 
    INTERNET_CONNECTION_CONFIGURED = 0x40 
}  

// Return true or false if connecting through a proxy server 
public bool connectingThroughProxy() 
{ 
    InternetConnectionState_e flags = 0; 
    InternetGetConnectedState(ref flags, 0); 
    bool hasProxy = false; 

    if ((flags & InternetConnectionState_e.INTERNET_CONNECTION_PROXY) != 0) 
    { 
     hasProxy = true; 
    } 
    else 
    { 
     hasProxy = false; 
    } 

    return hasProxy; 
} 

Respuesta

25

Parece que WebRequest.DefaultWebProxy es official replacement para WebProxy.GetDefaultProxy.

Debería poder incluirlo en su código original con solo una pequeña modificación. Algo así como:

WebProxy proxy = (WebProxy) WebRequest.DefaultWebProxy; 
if (proxy.Address.AbsoluteUri != string.Empty) 
{ 
    Console.WriteLine("Proxy URL: " + proxy.Address.AbsoluteUri); 
    wc.Proxy = proxy; 
} 
+0

Este es el enfoque recomendado, y lo aísla de tener que escribir muchos otros códigos. – EricLaw

+12

He descubierto que esto me da una excepción de lanzamiento de clases ya que WebRequest.DefaultWebProxy está devolviendo un WebProxyWrapper. Desafortunadamente, en mi caso, WebProxyWrapper no me da acceso al objeto WebProxy subyacente, lo cual es frustrante, ya que parece que el código que estoy tratando de depurar no aplica el proxy en el entorno activo, pero lo está haciendo en el entorno de desarrollo. – Dan

+5

Tengo el mismo problema. Logré obtener el URI del proxy web en su lugar usando: ** Uri uriProxy = WebRequest.DefaultWebProxy.GetProxy (Uri nuevo ("http: // someserver.com")); ** – Libor

1

Consulte la clase System.Net.Configuration.ProxyElement. Eso puede tener información que estás buscando.

Lo que usted describe funciona, también puede consultar el registro.

Aquí es un script de PowerShell que escribí de revisar el proxy:

function get-proxy 
{ 
    $path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" 
    $reg = get-itemproperty $path 
    return $reg 
} 
3

En primer lugar, GetDefaultProxy está marcado como obsoletos por lo que no tiene ninguna garantía que será de alrededor, incluso en el futuro inmediato. En segundo lugar, el Address puede ser nulo, por lo que el código que usted otorga arriesga una NullReferenceException:

5

WebClient etc. utilizan la configuración de WinHTTP (no la configuración de IE), ¡así que lo más fácil es configurar WinHTTP! En XP, etc., puede utilizar:

proxycfg -u 

para importar la configuración actual de IE en la tienda WinHTTP. Después de eso, WebClient etc. debería poder usar la misma configuración sin problema. En Vista y Windows 7, ahora se encuentra en:

netsh winhttp import proxy ie 

Debe ejecutar esto como administrador.

+0

He editado mi código utilizando una p/invoke. Esto funciona bien diciéndome si la informática se está conectando a través de un proxy. Sin embargo, haciendo referencia a mi publicación de código inicial. ¿Es esta la forma correcta de obtener la información sobre el proxy? es decir, dirección, puerto? Gracias. – ant2009

+0

Bueno, todavía mantengo que configurar WinHTTP es una mejor opción que consultarlo usted mismo. En el trabajo, todo el tráfico (no local) pasa a través de un proxy, y nunca tuve un problema simplemente usando 'WebClient' si primero configuré WinHTTP. –

+0

El problema con esta solución es que requiere que el usuario ejecute un comando cambiando la configuración de todo el sistema solo para usar su aplicación. En un entorno restringido, es posible que tampoco tengan acceso al comando y/o que su aplicación no tenga acceso a él. – tjmoore

3

intente lo siguiente:

public string GetMeMyInfo(string searchCriteria) 
{ 
    // Instatiate the web service and declare the necessary variables 
    WsService.WsServiceBus oWsGetInfo = new WsService.WsServiceBus(); 
    // Configure the Web Service Proxy 
    oWsGetInfo.Proxy = System.Net.WebProxy.GetDefaultProxy(); 
    oWsGetInfo.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 
    // Invoke the web service 
    return oWsGetInfo.GetInfo4Me(searchCriteria); 
} 

que hará que la configuración del proxy y las credenciales por defecto antes de invocar el servicio web, por ejemplo.

2

Al establecer mi proxy de solicitud en WebRequest.GetSystemWebProxy() resolvió el problema.

WebProxy.GetDefaultProxy() es la forma real, pero ahora está en desuso.

2
<system.net> 
<defaultProxy enabled="false" useDefaultCredentials="false"> 
    <proxy/> 
    <bypasslist/> 
    <module/> 
</defaultProxy> 

Usar este fragmento en el archivo application.config.

+0

+1. Esto funcionó para mí. Habilitado el rastreo para identificar el error (no se puede recuperar la configuración del proxy para uri). Luego, el proxy predeterminado (establecido por la política de dominio a un uri no válido) se estaba utilizando y fallaba al instante. Usé la configuración anterior y el boom. Fijo. –

Cuestiones relacionadas