У меня много проблем с подключением к Интернету в программе, над которой я работаю, и кажется, что все это происходит из-за некоторых проблем с настройками прокси. Большинство проблем на данный момент устранены, но проблема, с которой я столкнулся сейчас, заключается в том, что мой метод тестирования настроек прокси заставляет некоторых пользователей ждать в течение длительных периодов времени.
Вот что я делаю:
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, потому что мне нужно подождать, пока метод не будет сделан, чтобы я мог знать, правильны ли настройки, прежде чем продолжить в программе.
Любые предложения о лучшем методе или обходном пути для этого метода приветствуются.
Mike
РЕДАКТИРОВАТЬ: Я пытался что-то еще, но не повезло. Я использовал метод DownloadDataAsync для загрузки данных в отдельном потоке, который вызывает событие DownloadDataCompleted WebClient по завершении. Пока я жду, когда событие будет вызвано, у меня есть цикл: while (DateTime.Now
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