Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> несколько HttpWebRequest последовательно, проблема 
V
    Опции темы
_hunter
  Дата 28.5.2009, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: нет
Всего: 98



Добрый день.

Столкнулся с непонятной проблемой при использовании HttpWebRequest: если такую:
Код

private void DownloadTest ()
{
    HttpWebRequest request = WebRequest.Create("http://www.google.com/") as HttpWebRequest;
    if (request != null)
    {
        request.AllowAutoRedirect = false;
        request.KeepAlive = false;
        request.Method = "GET";

        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        if (response != null && response.StatusCode == HttpStatusCode.OK)
        {
        }
    }
}

функцию я вызываю один или два раза -- все происходит нормально. Но уже третий вызов блокируется (на request.GetResponse()). При этом собственно запрос никуда не уходит (смотрел Wireshark'ом). Причем запросы к другому домену (после первых двух) спокойно уходят, но, опять, не больше двух штук...

Что это за беда такая и как ее бороть?

С уважением...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
jonie
Дата 28.5.2009, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Код

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
делай.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
DVariuS
Дата 28.5.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: нет
Всего: 8



_hunter, попробуй таймаут запроса меньше сделать (по умолчанию 100000 мс):
Код

request.Timeout = 3000;


Гоню, это не поможет. jonie прав, его вариант 100% рабочий  smile 

Это сообщение отредактировал(а) DVariuS - 28.5.2009, 18:54
PM MAIL   Вверх
_hunter
Дата 28.5.2009, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: нет
Всего: 98



using помог. спасибо.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ar22
Дата 2.8.2009, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 2.8.2009

Репутация: нет
Всего: нет



Подскажите, как правильно применить using в этом примере, у меня такая же проблема просто
PM MAIL   Вверх
_hunter
Дата 4.8.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: нет
Всего: 98



да так и использовать, как написанно было...
если кодом:
Код

private void DownloadTest ()
{
    HttpWebRequest request = WebRequest.Create("http://www.google.com/") as HttpWebRequest;
    if (request != null)
    {
        request.AllowAutoRedirect = false;
        request.KeepAlive = false;
        request.Method = "GET";

        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {
            if (response != null && response.StatusCode == HttpStatusCode.OK)
            {
            }
        }
    }
}



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Mad
Дата 7.8.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: нет
Всего: 19



_hunter, using нужен, но также в конце загрузки надо вызывать response.Close()
Цитата('MSDN')

You must call either the Stream.Close or the HttpWebResponse.Close method to close the response and release the connection for reuse. It is not necessary to call both Stream.Close and HttpWebResponse.Close, but doing so does not cause an error.

Немного поясню, каждое соединение береться из пула (размер которого ограничен), и считаеться открытым (используемым) до вызова Stream.Close или  HttpWebResponse.Close.


--------------------
user posted image
PM MAIL   Вверх
mihryak
Дата 7.8.2009, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 3
Всего: 36



Цитата(Mad @  7.8.2009,  19:03 Найти цитируемый пост)
_hunter, using нужен, но также в конце загрузки надо вызывать response.Close()

не надо
открываем рефлектор, видим там
Код

void IDisposable.Dispose()
{
    try
    {
        this.Close();
        this.OnDispose();
    }
    catch
    {
    }
}

этот must подразумевает, что надо явно или неявно закрыть
PM MAIL ICQ   Вверх
jonie
Дата 11.8.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



mihryak правила хорошего тона подразумевают вызов close() даже если используется using, который неявно (с т.з. кода) вызовет Dispose....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mihryak
Дата 11.8.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 3
Всего: 36



Цитата(jonie @  11.8.2009,  13:04 Найти цитируемый пост)
правила хорошего тона подразумевают вызов close() даже если используется using, который неявно (с т.з. кода) вызовет Dispose.... 

спорить особо не буду (во многом из-за отсутствия "официальных" документов, которых здесь не может быть в принципе), но МСДН преподносит Dispose как метод, призванный освобождать все занятые объектом managed и unmanaged ресурсы, а я как-то себя приучил, что стоит отдавать себе отчёт в каждой написанной строчке кода, и у меня ну никак не получается два раза подряд один вызов писать
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0891 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.