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