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
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. –