2010-03-25 5 views
6

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

Antwort

2

Sie können die proxycheck in einem separaten Thread ausgeführt. Und betrachte den Check als fehlgeschlagen, wenn der Thread zu lange dauert.

Oder Sie könnten WebRequest verwenden, ermöglicht es Ihnen ein Timeout:

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

Wenn die Anforderung innerhalb der vorgegebenen Timeout nicht beendet hat eine WebException mit dem Status Eigenschaft auf WebExceptionStatus.Timeout geworfen werden.

+1

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

1

Alle hier genannten Methoden sind gültig. Am wichtigsten ist es jedoch, die Proxy-Verbindung mit demselben Windows-Benutzerkonto für den Prozess zu testen, den Sie testen möchten. Viele Proxys haben spezifische Berechtigungen für jeden Windows-Benutzer.

0

Ein aktueller Beitrag Testing IP:Port proxies erläutert Proxy-Überprüfung mit einem einfachen Python-Skript. Das Skript überprüft die Verfügbarkeit und Korrektheit von Proxy-Servern.

Verwandte Themen