Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > несколько HttpWebRequest последовательно


Автор: _hunter 28.5.2009, 17:27
Добрый день.

Столкнулся с непонятной проблемой при использовании 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'ом). Причем запросы к другому домену (после первых двух) спокойно уходят, но, опять, не больше двух штук...

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

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

Автор: jonie 28.5.2009, 18:45
Код

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

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

request.Timeout = 3000;


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

Автор: _hunter 28.5.2009, 18:54
using помог. спасибо.

Автор: Ar22 2.8.2009, 00:26
Подскажите, как правильно применить using в этом примере, у меня такая же проблема просто

Автор: _hunter 4.8.2009, 19:23
да так и использовать, как написанно было...
если кодом:
Код

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)
            {
            }
        }
    }
}

Автор: Mad 7.8.2009, 18:03
_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.

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

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

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

этот must подразумевает, что надо явно или неявно закрыть

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

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

спорить особо не буду (во многом из-за отсутствия "официальных" документов, которых здесь не может быть в принципе), но МСДН преподносит Dispose как метод, призванный освобождать все занятые объектом managed и unmanaged ресурсы, а я как-то себя приучил, что стоит отдавать себе отчёт в каждой написанной строчке кода, и у меня ну никак не получается два раза подряд один вызов писать

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