Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Webrequest не работает cо второго раза


Автор: wester 28.8.2010, 19:32
Доброго времени суток.
помогите разобраться. 
при первом запросе, когда нужно построить корень дерева ссылок я его спокойно получаю, 
но когда я пытаюсь по одной из ссылок проследовать то меня ждет WebException ( таймаут при получении ответа)
грешил, что проблемы с сетью - нет проблем, попробовал подключиться через прокси fiddler ("localhost:8888") и все работает !
все работает как надо. 

вот код
Код

private void GetCategoryHtmlResponseWithoutProxy(WebResponse response)
        {
            var request = (HttpWebRequest) WebRequest.Create(response.ResponseUri.AbsoluteUri);
            request.UserAgent = UserAgentChrome7;
            request.Accept = AcceptString; 
            request.Proxy = new WebProxy("localhost:8888");
           // request.Proxy = WebProxy.GetDefaultProxy();

            
            request.ContentType = "application/x-www-form-urlencoded";
            request.Method = "GET";
            request.UseDefaultCredentials = true;
            WebResponse webResponse = null;
            try
            {
                webResponse = request.GetResponse();
            }
            catch (WebException exc)
            {
                Debug.WriteLine(exc.Status);
                Debug.WriteLine(exc.Response);
                throw new WebException("exc");
            }
            
            WebResponce = webResponse;


причем самое удивительное - метод первый раз без прокси отрабатывает, а вот последующий раз не хочет - только с прокси

Автор: diadiavova 29.8.2010, 10:33
А что ты делаешь в последней строчке? smile 

А вообще, попробуй в конце метода написать
Код

webResponse.Close();

Автор: wester 29.8.2010, 10:58
diadiavova, 
WebResponse у меня поле класса, которое я уже передаю в другой класс.
закрыть я его не могу - так как получу эксепшн из - за освобожденного ресурса.

я думал проблема с параметром 
переделал под 

Код

private void GetCategoryHtmlResponseWithoutProxy(string param)
        {
            var request = (HttpWebRequest)WebRequest.Create(param);
            request.UserAgent = Firefox368;
            request.Accept = AcceptString;
            request.AllowAutoRedirect = true;

            request.ContentType = "application/x-www-form-urlencoded";
            request.Method = "GET";
            request.SendChunked = true;
            request.AllowAutoRedirect = true;
            HttpWebResponse webResponse;
            try
            {
                 webResponse = (HttpWebResponse)request.GetResponse(); // вот тута у меня WebException по таймауту
                Debug.WriteLine(webResponse.StatusCode);
                Debug.WriteLine(webResponse.StatusDescription);
                
                

            }
            catch (WebException exc)
            {
                Debug.WriteLine(exc.Status);
                Debug.WriteLine(exc.Response);
                throw new WebException("exc");
            }

            WebResponse = webResponse;
            GetHtmlFromResponse(); // метод, который из WebResponse получает исходник страницы, который я передам в другой класс
            webResponse.Close(); // буду передавать не WebResponse, а строку с исходником html


Код

public void GetHtmlFromResponse()
        {

            String htmlSource;
            using (var sr = new StreamReader(WebResponse.GetResponseStream(), Encoding.UTF8))
            {
                htmlSource = sr.ReadToEnd();
            }
            HtmlSource = htmlSource;
            WebResponse.Close(); // здесь я закрываю WebResponse
        }

меня больше удивляет почему когда запущен Fiddler я могу работать, а когда не работает не могу

Автор: diadiavova 29.8.2010, 12:33
Цитата(wester @  29.8.2010,  11:58 Найти цитируемый пост)
WebResponse у меня поле класса, которое я уже передаю в другой класс.

Зачем?
Цитата(wester @  29.8.2010,  11:58 Найти цитируемый пост)
GetHtmlFromResponse(); // метод, который из WebResponse получает исходник страницы, который я передам в другой класс

А не проще ли этому методу параметр прикрутить?
Цитата(wester @  29.8.2010,  11:58 Найти цитируемый пост)
webResponse.Close(); // буду передавать не WebResponse, а строку с исходником html

 smile 
Цитата(wester @  29.8.2010,  11:58 Найти цитируемый пост)
меня больше удивляет почему когда запущен Fiddler я могу работать, а когда не работает не могу

Потому  что ты отправляешь запрос локальному серверу, а тот в свою очередь отправляет такой же запрос куда надо, только фиддлер закрывает соединение.

Автор: wester 29.8.2010, 13:28
diadiavova, 
спасибо, разобрался теперь как работает Fiddler.

все оказалось очень просто 
оказывается надо было обрабатывать запрос сразу, а не посылыть второй реквест на ту же страницу

в итоге получилось

Код

public void GetResponseWithoutProxy(String url)
        {
            var request = (HttpWebRequest)WebRequest.Create(url);
            request.UserAgent = UserAgentChrome7;
            request.Accept = AcceptString;
            var response = request.GetResponse();
            if (DetectAdress(response.ResponseUri.PathAndQuery))
            {
                GetVendorHtmlResponseWithoutProxy(response);
                
                IsVendorList = true;
                
            }
            else
            {
                GetHtmlFromResponse(response); // получаем строку с сорцом

                IsVendorList = false;
                
            }
        }


проблема решена

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)