如何解决“无法访问已处置对象 System.net.HttpWebResponse”?

How to solve " cannot access disposed object System.net.HttpWebResponse"?

我有一个可以调用服务器的控制台应用程序。我意识到我错过了将它放入 using 语句中,一旦我这样做了,我就一直收到这个错误:

"Cannot access a disposed object.\r\nObject name: 'System.Net.HttpWebResponse'."

在 google 之后我尝试了几次,其中之一是:

  <system.net>
    <settings>
      <httpWebRequest useUnsafeHeaderParsing="true" />
    </settings>
  </system.net>

在app.config

我仍然得到同样的错误,我不知道为什么, 我的代码:

public static HttpWebResponse CallServer(string url)
{
    var request = (HttpWebRequest)WebRequest.Create(url);
    var webResp = (HttpWebResponse)null;
    using (webResp = (HttpWebResponse)request.GetResponse())
    {

    }

    return webResp;
}

我该如何解决这个问题?

您的 using (webResp ...) 导致响应被放置在 using 语句的结束括号中。之后访问响应将失败。

简单的解决方案是延迟处理 webResp,直到您真正处理完它。您可以在接收方法中处理它 webResp.

我想你应该创建一个 using 有点像这样的:

using (HttpWebResponse x = CallServer(url))
{ }

并删除 CallServer 方法中的 using

编译器将 using 语句翻译成如下形式:

HttpWebResponse webResp;
try
{
    webResp = (HttpWebResponse)request.GetResponse();
}
finally
{
    webResp.Dispose();
}

所以如果你想 return webResp 并在你的方法之外使用这个对象,你不能把它放在 using 语句中,因为 usingDispose 对象。并且您不能使用已处置的对象(正如异常消息明确指出的那样)。

您可能希望将对 CallServer 的调用包装在 using 语句中:

using (HttpWebResponse webResp = CallServer("http://..."))
{
   // do something with your response
}