Исключение Operation Timed out в методе httpWebRequest.GetResponse() закрывает соединение

Мой вопрос может быть глупым, но нужен ответ. Насколько мне известно, всякий раз, когда в методе HttpWebRequest.GetResponse() возникает исключение «Время ожидания операции истекло», соединение закрывается и освобождается. Если это не так, то как это работает? Я пытался найти это в Google, но не смог получить ответ.

РЕДАКТИРОВАТЬ: В этом случае это был почтовый запрос, соединение было установлено, и вызываемый URL-адрес обрабатывал запрос на стороне сервера, но объект HttpWebRequest ожидал ответа и после некоторого исключения произошло исключение.


person Nps    schedule 27.06.2015    source источник


Ответы (2)


Насколько я понимаю, вы должны вызвать метод Close, чтобы закрыть поток и разорвать соединение. Невыполнение этого требования может привести к тому, что у вашего приложения закончатся соединения. Если вы не уверены, вы всегда можете поместить блок try/catch вокруг метода Close или метода HttpWebRequest.GetResponse().

person SteveFerg    schedule 27.06.2015
comment
О каком методе Close мы здесь говорим? HttpWebRequest не имеет метода Close, а HttpWebResponse здесь еще не инициализирован. - person Nps; 28.06.2015

Ну, я не совсем уверен, но похоже, что исключение Operation TimedOut, вероятно, приводит к сбою в основном канале соединения; привести к тому, что весь запрос после этого заканчивается тем же исключением.

Согласно документации MSDN

Вы должны вызвать метод Close, чтобы закрыть поток и разорвать соединение. Невыполнение этого требования может привести к тому, что у вашего приложения закончатся соединения.

Я сделал небольшую пробную версию, чтобы увидеть

    private static void MakeRequest()
    {
        WebRequest req = null;
        try
        {
            req = WebRequest.Create("http://www.wg.net.pl");
            req.Timeout = 10;                
            req.GetResponse();
        }
        catch (Exception ex)
        {

            Console.WriteLine(ex.Message);
            req.Timeout = 10000;
            req.GetResponse(); // This as well results in TimeOut exception
        }
    }
person Rahul    schedule 27.06.2015
comment
О каком методе Close мы здесь говорим? HttpWebRequest не имеет метода Close, а HttpWebResponse здесь еще не инициализирован. - person Nps; 28.06.2015
comment
Но исключение возникает в методе GetResponse(), который возвращает объект HttpWebResponse, который не возвращается из-за исключения. Я не могу вызвать метод Close для нулевого объекта. - person Nps; 28.06.2015
comment
@Nps, это правильно, и вызов close() - это скорее лучшая практика. В этом конкретном случае я не понимаю, зачем даже вызывать close(), поскольку он, вероятно, уже закрыт. - person Rahul; 28.06.2015
comment
это был мой вопрос, поэтому исключение автоматически закроет соединение. Нам не нужно обрабатывать в этой конкретной ситуации. - person Nps; 28.06.2015
comment
Да, по крайней мере, мне так кажется, поскольку в реальности связь не устанавливается. - person Rahul; 28.06.2015
comment
Извините, мне придется уйти сейчас, и я не смогу помочь больше, чем то, что у меня уже есть. - person Rahul; 28.06.2015
comment
Добавлено больше деталей в вопросе - person Nps; 28.06.2015