HttpWebRequest不会抛出异常

时间:2012-11-08 08:26:55

标签: c# httpwebrequest timeout httpwebresponse webexception

我遇到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");
}

在我输入不存在的网址时,如公司网络,例如www.oiuahsdupiasduiuhid.com;它抛出了我们的感受。我收到了状态代码:找不到或服务不可用。但是,如果我在家里尝试,它不会抛出任何异常。它等待大约1秒钟,然后没有任何错误停止工作。我删除所有异常以查看发生了什么,但问题是它没有显示任何错误。 你对这个问题有什么看法吗?

或者任何建议,我如何以不同的方式处理这个问题?

2 个答案:

答案 0 :(得分:0)

在不了解您的应用程序设计的情况下,特别是在调用堆栈中进一步处理异常处理时,很难说它为何会像您在家时那样表现。

但是,当我尝试使用您的确切代码时,它确实会抛出WebException,但是httpResponse.StatusCode会抛出NullReferenceException,因为httpResponse为空。如果您可能在调用堆栈中进一步吞噬此异常,则可以解释您所看到的情况。

在许多httpResponse个案例中,

WebException将为空,因为您的请求未收到任何响应,特别是在超时方案中。

在投射WebException.Response之前,您需要检查WebException.Status属性。如果该状态表明收到了响应,那么您可以检查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(HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse())
{
    // do something with response
}

答案 1 :(得分:0)

感谢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);
 }