Изменение DefaultWebProxy вызывает тайм-аут веб-запросов - PullRequest
0 голосов
/ 01 декабря 2009

Для проекта, над которым я работаю, у нас есть настольная программа, которая связывается с онлайн-сервером магазина. Поскольку он используется в школах, правильно настроить прокси-сервер сложно. Мы пошли на то, чтобы позволить пользователям указывать данные прокси, если они хотят, в противном случае он использует те из IE. Мы также пытались обойти ввод неправильных данных, поэтому код пытается использовать указанный прокси-сервер, если он не работает по умолчанию, если он не работает, то с учетными данными, если это не удается, то null.

Проблема, с которой я столкнулся, заключается в том, что в местах, где необходимо последовательно изменять настройки прокси-сервера (например, если их регистрация не удалась из-за неправильного прокси-сервера, они меняют одну мелочь и повторную попытку, что занимает несколько секунд.) Я заканчиваю вызовами тайм-аута HttpRequests .GetResponse (), в результате чего программа на некоторое время зависает. Иногда, если я оставляю одну или две минуты между изменениями, он не останавливается, но не каждый раз (просто повторите попытку через 10 минут, и время снова истекло).

Я не могу найти в коде ничего, что могло бы вызвать это - хотя это выглядит немного грязно. Я не думаю, что это может быть сервер, отклоняющий запрос, если он не является общим поведением сервера, поскольку я пробовал это с запросами к нашему серверу и другим, таким как google.co.uk.

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

Тесты, которые мы запускаем, не имеют прокси, поэтому первая часть обычно пропускается. Когда ApplyProxy запускается в первый раз, он работает нормально и завершает все в первом блоке try, во-вторых, он может либо выполнить тайм-аут на GetResponse в первом блоке try, а затем пройти оставшуюся часть кода, либо он может работать там и тайм-аут по фактическим запросам на регистрацию.

Код:

void ApplyProxy () {

        Boolean ProxySuccess = true;
        String WebRequestURI = @"http://www.google.co.uk";

        if (UseProxy)
        {
            try
            {
                String ProxyUrl = (ProxyUri.ToLower().Contains("http://")) ?
                    ProxyUri :
                    "http://" + ProxyUri;

                WebRequest.DefaultWebProxy = new WebProxy(ProxyUrl);
                if (!string.IsNullOrEmpty(ProxyUsername) && !string.IsNullOrEmpty(ProxyPassword))
                    WebRequest.DefaultWebProxy.Credentials = new NetworkCredential(ProxyUsername, ProxyPassword);
                HttpWebRequest request = HttpWebRequest.Create(WebRequestURI) as HttpWebRequest;
                request.Method = "GET";
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            }
            catch
            {
                ProxySuccess = false;
            }
        }
        if(!ProxySuccess || !UseProxy)
        {
            try
            {
                WebRequest.DefaultWebProxy = WebRequest.GetSystemWebProxy();
                HttpWebRequest request = HttpWebRequest.Create(WebRequestURI) as HttpWebRequest;
                request.Method = "GET";
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            }
            catch (Exception e)
            { //try with credentials
                //make a new proxy from defaults
                WebRequest.DefaultWebProxy = WebRequest.GetSystemWebProxy();
                String newProxyURI = WebRequest.DefaultWebProxy.GetProxy(new Uri(WebRequestURI)).ToString();
                if (newProxyURI == String.Empty)
                { //check we actually get a result
                    WebRequest.DefaultWebProxy = null;
                    return;
                }
                //continue
                WebProxy NewProxy = new WebProxy(newProxyURI);
                NewProxy.UseDefaultCredentials = true;
                NewProxy.Credentials = CredentialCache.DefaultCredentials;
                WebRequest.DefaultWebProxy = NewProxy;

                try
                {
                    HttpWebRequest request = HttpWebRequest.Create(WebRequestURI) as HttpWebRequest;
                    request.Method = "GET";
                    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                }
                catch
                {
                    WebRequest.DefaultWebProxy = null;
                }
            }

        }
    } 

Ответы [ 2 ]

0 голосов
/ 04 декабря 2009

Кажется, ошибка программирования от моего имени. Запросы были оставлены открытыми, и, очевидно, это не понравилось ни программе, ни серверу. Простое закрытие HttpWebRequests после выполнения, кажется, устраняет эту проблему.

0 голосов
/ 01 декабря 2009

Разве это не просто необходимость установить свойство Timeout HttpWebRequest? Может случиться так, что соединение устанавливается, но не обслуживается (например, неправильный тип прокси-сервера или остановленный сервер), и в этом случае может случиться так, что запрос ожидает период времени ожидания перед тем, как прекратить работу - более короткий тайм-аут может быть предпочтительным здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...