2010-03-25 2 views
6

У меня много проблем с подключением к Интернету в программе, над которой я работаю, и все это, похоже, возникает из-за некоторой проблемы с настройками прокси-сервера. Большинство проблем на этом этапе исправлены, но проблема, с которой я столкнулся сейчас, заключается в том, что мой метод тестирования параметров прокси-сервера заставляет некоторых пользователей ждать длительные периоды времени.Каков предпочтительный или принятый метод тестирования настроек прокси-сервера?

Вот что я делаю:

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 
} 

Это единственный способ, который я нашел, чтобы проверить, если параметры прокси-сервера правильны. Я попробовал позвонить в веб-службу, но при выполнении вызова не требуются настройки прокси-сервера. Он будет работать, даже если у меня есть фиктивные настройки прокси. Вышеуказанный метод, однако, не имеет члена тайм-аута, который я могу установить, что я могу найти, и я использую DownloadData в отличие от DownloadDataAsync, потому что мне нужно подождать, пока метод не будет выполнен, чтобы я мог знать, правильны ли настройки, прежде чем продолжить в программе.

Любые предложения по лучшему методу или работа по этому методу оцениваются.

Майк

EDIT: Я пытался что-то другое, но не повезло. Я использовал метод DownloadDataAsync для загрузки данных в отдельном потоке, который вызывает завершение события DownloadDataCompleted WebClient. В то время как я жду, когда событие будет вызвано, у меня есть цикл: while (DateTime.Now < downloadStart.AddMinutes (timeout) & &! TestIsDone) {} Событие DownloadDataCompleted присваивает члену TestIsDone значение true при вызове события. Проблема здесь в том, что параметры прокси-сервера плохие. Событие никогда не вызывается, не генерируется исключение, и программа ждет весь период ожидания, прежде чем продолжить. Вот код этого подхода:

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

Извините за длинный пост. Я хотел обновить этот вопрос с информацией, которую я нашел после тестирования этого нового подхода.

Спасибо, Mike

ответ

2

Вы можете запустить proxycheck в отдельном потоке. И подумайте, что проверка будет неудачной, если поток занимает слишком много времени.

Или вы могли бы использовать WebRequest, он позволяет установить тайм-аут:

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

Если запрос не завершен в течение заданного таймаута WebException с Status имущества установлено в WebExceptionStatus.Timeout будет выброшен.

+1

Я закончил использование этого метода отдельной нити, и он работает, но похоже, что это исправление kludge. Как только я получу время и возможность, я попробую другой метод, который выглядит намного лучше. Благодарю. –

1

Каждый метод, упомянутый здесь, действителен. Но самое главное - проверить подключение прокси с помощью той же учетной записи пользователя Windows для процесса, который вы хотите протестировать. Многие прокси имеют особые привилегии для каждого пользователя Windows.

0

Недавнее сообщение Testing IP:Port proxies объясняет проверку прокси с помощью простого сценария Python. Скрипт проверяет наличие и правильность прокси-серверов.

Смежные вопросы