Ich habe eine Menge Probleme mit der Internetverbindung in dem Programm, an dem ich gerade arbeite, und alles scheint sich aus einem Problem mit den Proxy-Einstellungen zu ergeben. Die meisten Probleme zu diesem Zeitpunkt sind behoben, aber das Problem, das ich jetzt habe, ist, dass meine Methode, die Proxy-Einstellungen zu testen, manche Benutzer dazu bringt, lange Zeit zu warten.Was ist die bevorzugte oder akzeptierte Methode zum Testen von Proxy-Einstellungen?
Hier ist, was ich tue:
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
}
Dies ist der einzige Weg, die ich gefunden habe, zu testen, ob die Proxy-Einstellungen korrekt sind. Ich habe versucht, einen Web-Service-Anruf an unseren Web-Service zu senden, aber für den Anruf sind keine Proxy-Einstellungen erforderlich. Es funktioniert auch, wenn ich falsche Proxy-Einstellungen habe. Die obige Methode hat jedoch kein Timeout-Mitglied, das ich einstellen kann, und ich benutze die DownloadData im Gegensatz zu DownloadDataAsync, weil ich warten muss, bis die Methode fertig ist, so dass ich weiß, ob die Einstellungen korrekt sind, bevor ich fortfahre im Programm.
Alle Vorschläge für eine bessere Methode oder eine Arbeit für diese Methode wird geschätzt.
Mike
EDIT: Ich habe versucht, etwas anderes, aber kein Glück. Ich habe die DownloadDataAsync-Methode verwendet, um die Daten in einem separaten Thread herunterzuladen, der das DownloadDataCompleted-Ereignis des WebClients auslöst, wenn der Vorgang abgeschlossen ist. Während ich darauf warte, dass das Ereignis aufgerufen wird, habe ich eine Schleife: while (DateTime.Now < downloadStart.AddMinutes (Zeitüberschreitung) & &! TestIsDone) {} Das DownloadDataCompleted-Ereignis setzt das TestIsDone-Mitglied auf true, wenn das Ereignis aufgerufen wird. Das Problem hier ist, wenn die Proxy-Einstellungen schlecht sind, wird das Event nie aufgerufen, es wird keine Ausnahme ausgelöst, und das Programm wartet auf die gesamte Zeitüberschreitung, bevor es fortfährt. Hier ist der Code für diesen Ansatz:
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");
}
Sorry über die lange Post. Ich wollte diese Frage mit den Informationen aktualisieren, die ich nach dem Testen dieses neuen Ansatzes gefunden habe.
Danke, Mike
Ich habe mit dieser separaten Thread-Methode aufgewickelt und es funktioniert, aber es scheint so ein Kludge zu beheben. Sobald ich die Zeit und Gelegenheit habe, werde ich die andere Methode ausprobieren, die viel besser aussieht. Vielen Dank. –