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

时间:2016-03-23 09:55:24

标签: c# httpwebrequest console-application httpwebresponse

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

  

"无法访问已处置的对象。\ r \ n对象名称:   ' System.Net.HttpWebResponse'"

谷歌之后我尝试了几次尝试,其中之一是:

  <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;
}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

您的using (webResp ...)会将响应置于using声明的结尾处。之后访问响应将失败。

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

的方法中处理它

我想你应该创建一个using,就像这样:

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

然后移除using方法中的CallServer

答案 1 :(得分:1)

编译器将using语句转换为如下内容:

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

因此,如果您想返回webResp并在方法之外使用此对象,则不得将其放在using语句中,因为usingDispose对象。并且您不能使用已处置的对象(正如异常消息明确指出的那样)。

您可能希望在CallServer声明中将您的电话打包到using

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