У меня много проблем с подключением к Интернету в программе, над которой я работаю, и все это, похоже, возникает из-за некоторой проблемы с настройками прокси-сервера. Большинство проблем на этом этапе исправлены, но проблема, с которой я столкнулся сейчас, заключается в том, что мой метод тестирования параметров прокси-сервера заставляет некоторых пользователей ждать длительные периоды времени.Каков предпочтительный или принятый метод тестирования настроек прокси-сервера?
Вот что я делаю:
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
Я закончил использование этого метода отдельной нити, и он работает, но похоже, что это исправление kludge. Как только я получу время и возможность, я попробую другой метод, который выглядит намного лучше. Благодарю. –