Я испытываю много затруднений с интернет-соединением в программе, я продолжаю работать, и все это, кажется, мечет икру от некоторой проблемы с настройками прокси. Большинство проблем в этой точке устраняется, но проблема, которую я имею теперь, - то, что мой метод тестирования настроек прокси заставляет некоторых пользователей ожидать в течение долгих промежутков времени.
Вот то, что я делаю:
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 по окончании. В то время как я ожидаю события, которое назовут, у меня есть цикл: в то время как (DateTime. Теперь <downloadStart. AddMinutes (тайм-аут) &&! TestIsDone) {} событие DownloadDataCompleted устанавливает члена TestIsDone на истинный, когда событие называют. Проблема здесь состоит в том, если настройки прокси плохи, Событие никогда не называют, никакое исключение не выдается, и программа ожидает в течение всего периода тайм-аута перед продолжением. Вот код для этого подхода:
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
Вы можете запустить прокси-проверку в отдельном потоке. И считайте проверку неудачной, если поток занимает слишком много времени.
Или вы можете использовать WebRequest, он позволяет вам установить тайм-аут:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://url");
request.Proxy = proxy;
request.Timeout = 2000;
Если запрос не завершился в течение заданного тайм-аута, возникнет WebException
со свойством Status
, установленным на Будет выброшен WebExceptionStatus.Timeout
.
Все упомянутые здесь методы действенны. Но наиболее важным является тестирование прокси-соединения с использованием той же учетной записи пользователя Windows для процесса, который вы хотите протестировать. Многие прокси имеют определенные привилегии для каждого пользователя Windows.