【问题标题】:HttpWebRequest doesn't throw exceptionHttpWebRequest 不会抛出异常
【发布时间】:2012-11-08 08:26:55
【问题描述】:

我遇到了 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)时;它抛出 webexception 。我得到状态码:未找到或服务不可用。但是,如果我在家里尝试,它不会抛出任何异常。它等待大约 1 秒,然后没有任何错误停止工作。我删除了所有异常以查看发生了什么,但问题是它没有显示任何错误。 您对问题所在有任何想法吗?

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

【问题讨论】:

  • 您在家时是否使用调试器确定在不存在的站点上调用HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse(); 后会发生什么?
  • 是的,我尝试在 HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse(); 行使用调试器没有显示任何东西。我尝试了 response2.close();程序停止(继续运行但不继续执行命令)不显示任何内容。所以甚至直到行 (response2.close();) 才起作用,所以我再也看不到调试器发生了什么。
  • 此外,当我输入一个不存在的公司时,它也不会关闭响应。在 HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse() 之后;行转到 webexception。有趣的一点是为什么在家里它不去webexception?
  • 这就是我想问的......你怎么知道它没有?有没有在WebExceptioncatch 块中设置断点查看?
  • 在你提出问题后,我尝试了几件事,我发现它实际上可以工作,直到 webexception 调试器显示远程名称无法解析:'www.oijsasad.com' 但为什么它没有之后显示任何内容,甚至我添加 listbox.items.add("sdsadsa");直接在 webexception 之后它不显示它。越来越有趣了。

标签: c# httpwebrequest timeout httpwebresponse webexception


【解决方案1】:

如果不了解您的应用程序设计的更多信息,特别是调用堆栈中的异常处理,很难说为什么它的行为就像您在家时一样。

但是当我刚刚尝试您的确切代码时,它确实抛出了 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);
}

附带说明,当HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse(); 抛出异常时,您的response2.Close(); 永远不会被调用,因此您应该将其包装在 using 块中:

using(HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse())
{
    // do something with response
}

【讨论】:

  • 我正在听取您的建议。我会让你知道结果谢谢:)
  • 是的,非常感谢。它工作完美:) 我将添加所有命令。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多