2010-03-25 12 views
6

Tengo muchos problemas con la conectividad a Internet en el programa en el que estoy trabajando y todo parece surgir de algún problema con la configuración del proxy. La mayoría de los problemas en este momento son fijos, pero el problema que estoy teniendo ahora es que mi método para probar la configuración del proxy hace que algunos usuarios esperen largos períodos de tiempo.¿Cuál es el método preferido o aceptado para probar la configuración de proxy?

Aquí es lo que hago:

System.Net.WebClient webClnt = new System.Net.WebClient(); 

webClnt.Proxy = proxy; 
webClnt.Credentials = proxy.Credentials; 

byte[] tempBytes; 
try 
{ 
    tempBytes = webClnt.DownloadData(url.Address); 
} 
catch 
{ 
    //Invalid proxy settings 

    //Code to handle the exception goes here 
} 

Esta es la única manera que he encontrado para probar si la configuración de proxy es correcta. Intenté hacer una llamada de servicio web a nuestro servicio web, pero no se necesitan configuraciones de proxy al hacer la llamada. Funcionará incluso si tengo configuraciones de proxy falsas. El método anterior, sin embargo, no tiene un miembro de tiempo de espera que pueda establecer y pueda usar DownloadData en lugar de DownloadDataAsync porque necesito esperar hasta que el método esté hecho para poder saber si la configuración es correcta antes de continuar en el programa.

Se agradece cualquier sugerencia sobre un mejor método o una solución alternativa para este método.

Mike

EDIT: He intentado algo más, pero no hubo suerte. Usé el método DownloadDataAsync para descargar los datos en un hilo separado que eleva el evento DownloadDataCompleted del WebClient cuando haya terminado. Mientras espero que se llame el evento, tengo un bucle: while (DateTime.Now < downloadStart.AddMinutes (timeout) & &! TestIsDone) {} El evento DownloadDataCompleted establece el miembro TestIsDone en true cuando se invoca el evento. El problema aquí es que si la configuración del proxy es incorrecta, nunca se llama al evento, no se lanza ninguna excepción y el programa espera todo el tiempo de espera antes de continuar. Aquí está el código para este enfoque:

public static bool TestProxy(System.Net.WebProxy proxy) 
{ 
    ProxySettingsTestDone = false; //public static var 
    string address = //url to some arbitrary data on our server 

    System.Net.WebClient webClnt = new System.Net.WebClient(); 

    webClnt.Proxy = proxy; 
    webClnt.Credentials = proxy.Credentials; 

    try 
    { 
     webClnt.DownloadDataCompleted += new System.Net.DownloadDataCompletedEventHandler(DownloadDataCallback); 
     webClnt.DownloadDataAsync(new Uri(address)); 

     //Timeout period 
     DateTime dnldStartTime = DateTime.Now; 
     while (DateTime.Now < dnldStartTime.AddMinutes(1.0) && !ProxySettingsTestDone) 
     { } 

     if (!ProxySettingsTestDone) //Exceded timeout 
     { 
      throw new System.Net.WebException("Invalid Proxy Settings"); 
     } 
    } 
    catch (System.Net.WebException e) 
    { 
     if (e.Status == System.Net.WebExceptionStatus.ProxyNameResolutionFailure) 
     { 
      //Proxy failed, server may or may not be there 
      Util.ConnectivityErrorMsg = e.Message; 
      return false; 
     } 
     else if (e.Status == System.Net.WebExceptionStatus.ProtocolError) 
     { 
      //File not found, server is down, but proxy settings succeded 
      ServerUp = false; 
      Util.ConnectivityErrorMsg = e.Message; 
      return true; 
     } 

     return false; 
    } 

    Util.ConnectivityErrorMsg = ""; 
    return true; 
} 

private static void DownloadDataCallback(object sender, System.Net.DownloadDataCompletedEventArgs e) 
{ 
    if (!e.Cancelled && e.Error == null) 
     ProxySettingsTestDone = true; 
    else 
     throw new System.Net.WebException("Invalid Proxy Settings"); 
} 

Disculpa por la publicación. Quería actualizar esta pregunta con la información que encontré después de probar este nuevo enfoque.

Gracias, Mike

Respuesta

2

Puede ejecutar el proxycheck en un hilo separado. Y considere que la verificación fallará si el hilo tarda demasiado.

O usted podría utilizar WebRequest, que le permite establecer un tiempo de espera:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://url"); 
request.Proxy = proxy; 
request.Timeout = 2000; 

Si la solicitud no ha terminado dentro del tiempo de espera determinado serán lanzados una WebException con la propiedad Status establecido en WebExceptionStatus.Timeout.

+1

Terminé usando este método de subprocesos separados y funciona, pero parece una solución de tal kludge. Una vez que tenga el tiempo y la oportunidad, probaré con el otro método, que se ve mucho mejor. Gracias. –

1

Todos los métodos mencionados aquí son válidos. Pero la más importante es probar la conexión Proxy usando la misma cuenta de usuario de Windows para el proceso que desea probar. Muchos proxies tienen privilegios específicos para cada usuario de Windows.

0

Una publicación reciente Testing IP:Port proxies explica la verificación de proxy utilizando un simple script de Python. El script comprueba la disponibilidad y la corrección de los servidores proxy.

Cuestiones relacionadas