HttpWebRequest не генерирует исключение

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

try
{    
    Uri url= new Uri("https://www.example.com");
    HttpWebRequest request2 =(HttpWebRequest)WebRequest.Create(url);

    request2.Timeout = 10000;

    HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse();
    response2.Close();
}
catch (TimeoutException)
{
    listBox.Items.Insert(0, "Timeout");
}
catch (WebException ex)
{
    using (WebResponse response = ex.Response)
    {
        HttpWebResponse httpResponse = (HttpWebResponse)response;
        listBox.Items.Insert(0, "Status code(Benchmark):" + httpResponse.StatusCode);
    }
}
catch
{
    listBox.Items.Insert(0, "Failure");
}

В сети компании, когда я ввожу несуществующий URL-адрес, например www.oiuahsdupiasduiuhid.com; это вызывает исключение webexception. Я получил код статуса: не найден или услуга недоступна. Однако, если я попробую его дома, это не вызовет никаких исключений. Он ждет около 1 секунды, а затем без ошибок перестает работать. Я удаляю все исключения, чтобы увидеть, что происходит, но проблема в том, что никаких ошибок нет. Вы хоть представляете, в чем проблема?

Или любая рекомендация, как я могу решить эту проблему по-другому?


person Oktay    schedule 08.11.2012    source источник
comment
Вы использовали отладчик, чтобы определить, что происходит после вызова HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse(); на несуществующем сайте, когда вы находитесь дома?   -  person psubsee2003    schedule 08.11.2012
comment
да, я пробовал использовать отладчик в строке HttpWebResponse response2 = (HttpWebResponse) request2.GetResponse (); ничего не показывал. Я пробовал response2.close (); программа останавливается (продолжает работать, но не выполняет следующие команды) ничего не показывает. поэтому даже не работает, пока не появится строка (response2.close ();), поэтому я не могу снова увидеть, что происходит с отладчиком.   -  person Oktay    schedule 08.11.2012
comment
Кроме того, в компании, когда я ввожу несуществующий, он также не закрывает отклик. после HttpWebResponse response2 = (HttpWebResponse) request2.GetResponse (); строка переходит в webexception. интересно вот почему дома не идет на webexception?   -  person Oktay    schedule 08.11.2012
comment
Это то, что я пытаюсь спросить .... откуда вы знаете, что это не так? Вы установили точку останова в WebException блоке catch, чтобы увидеть?   -  person psubsee2003    schedule 08.11.2012
comment
после того, как вы зададите вопросы, я попробую несколько вещей, и я вижу, что на самом деле это работает, пока отладчик webexception не покажет, что удаленное имя не может быть разрешено: 'www.oijsasad.com', но почему после этого ничего не отображается, и даже я добавляю listbox.items.add (sdsadsa); сразу после webexception это не отображается. Становится интереснее.   -  person Oktay    schedule 08.11.2012
comment
Но доходит ли оно до блока WebException? Из того, что я упомянул в своем ответе, ваш WebException может вызвать исключение, которое будет обрабатываться дальше в стеке вызовов.   -  person psubsee2003    schedule 08.11.2012


Ответы (2)


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

Но когда я просто попробовал ваш точный код, он выдал WebException, однако httpResponse.StatusCode выдает NullReferenceException, потому что httpResponse имеет значение null. Если вы потенциально проглатываете это исключение дальше по стеку вызовов, это может объяснить ситуацию, которую вы наблюдаете.

httpResponse будет иметь значение null во многих WebException случаях, потому что ваш запрос не получил ответа, особенно в сценарии тайм-аута.

Перед трансляцией WebException.Response необходимо проверить _8 _ собственность. Если этот статус предполагает, что ответ был получен, вы можете проверить WebException.Response, иначе он просто будет нулевым. Попробуйте что-нибудь вроде:

if(e.Status == WebExceptionStatus.ProtocolError) {
    listBox.Items.Insert("Status Code : {0}", 
       ((HttpWebResponse)e.Response).StatusCode);
}
else
{
    listBox.Items.Insert("Status : {0}", ex.Status);
}

Кстати, ваш response2.Close(); никогда не будет вызываться, когда HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse(); выдает исключение, поэтому вы должны заключить его в блок using:

using(HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse())
{
    // do something with response
}
person psubsee2003    schedule 08.11.2012
comment
Я работаю по твоему совету. О результатах сообщу спасибо :) - person Oktay; 08.11.2012
comment
да, большое спасибо. работает отлично :) Добавлю все команды. - person Oktay; 08.11.2012

Спасибо psubsee2003. Я получил свой ответ. вот мой код, который работает правильно. Я добавил следующие коды в webexception.

if (ex.Status == WebExceptionStatus.ProtocolError)

 {
   using (WebResponse response = ex.Response)

{
   HttpWebResponse httpResponse = (HttpWebResponse)response;
   listBox2.Items.Insert(0, "Status:" + httpResponse.StatusCode);

}
 }

else
{
   listBox2.Items.Insert(0, "Status: " + ex.Status);
 }
person Oktay    schedule 08.11.2012