2010-03-25 8 views
6

Ho un sacco di problemi con la connettività internet nel programma su cui sto lavorando e tutto sembra generato da qualche problema con le impostazioni del proxy. La maggior parte dei problemi a questo punto sono risolti, ma il problema che sto avendo ora è che il mio metodo di test delle impostazioni del proxy fa aspettare alcuni utenti per lunghi periodi di tempo.Qual è il metodo preferito o accettato per testare le impostazioni del proxy?

Ecco quello che faccio:

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 
} 

Questo è l'unico modo che ho trovato per verificare se le impostazioni del proxy siano corrette. Ho provato a effettuare una chiamata al servizio web sul nostro servizio web, ma non sono necessarie impostazioni proxy quando si effettua la chiamata. Funzionerà anche se sono presenti impostazioni proxy fasulle. Il metodo sopra, però, non ha un membro di timeout che posso impostare che posso trovare e uso il DownloadData in contrapposizione a DownloadDataAsync perché devo aspettare che il metodo sia fatto in modo che possa sapere se le impostazioni sono corrette prima di continuare acceso nel programma.

Qualsiasi suggerimento su un metodo migliore o una soluzione per questo metodo è apprezzato.

Mike

EDIT: Ho provato qualcosa di diverso, ma senza fortuna. Ho usato il metodo DownloadDataAsync per scaricare i dati in un thread separato che alza l'evento DownloadDataCompleted del WebClient al termine. Mentre aspetto che l'evento venga richiamato, ho un ciclo: while (DateTime.Ora < downloadStart.AddMinutes (timeout) & &! TestIsDone) {} L'evento DownloadDataCompleted imposta il membro TestIsDone su true quando viene chiamato l'evento. Il problema qui è che se le impostazioni del proxy sono negative, l'evento non viene mai chiamato, non viene generata alcuna eccezione e il programma attende l'intero periodo di timeout prima di continuare. Ecco il codice per questo approccio:

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

Ci scusiamo per il post lungo. Volevo aggiornare questa domanda con le informazioni che ho trovato dopo aver testato questo nuovo approccio.

Grazie, Mike

risposta

2

È possibile eseguire il proxycheck in un thread separato. E considera il controllo fallito se il thread impiega troppo tempo.

Oppure si potrebbe usare WebRequest, permette di impostare un timeout:

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

Se la richiesta non ha finito entro il timeout data saranno gettati un WebException con la Status proprietà impostata a WebExceptionStatus.Timeout.

+1

Ho finito con l'utilizzo di questo metodo di thread separato e funziona, ma sembra una correzione di tipo kludge. Una volta ottenuto il tempo e l'opportunità, proverò l'altro metodo che sembra molto meglio. Grazie. –

1

Ogni metodo menzionato qui è valido. Ma la più importante è testare la connessione Proxy usando lo stesso account utente di Windows per il processo che si desidera testare. Molti proxy hanno privilegi specifici per ogni utente di Windows.

0

Un recente post Testing IP:Port proxies spiega il controllo del proxy utilizzando un semplice script Python. Lo script verifica la disponibilità e la correttezza dei server proxy.

Problemi correlati