System.ObjectDisposedException: '无法访问已释放的对象。'

3

这是我连接到不受信任的服务器的代码,但我总是收到这个错误。我将代码放在using语句中,但它没有起作用,返回空字符串。我之前也尝试过并查看了此问题的链接,但它没有起作用。

private String requestAndResponse(String url)
    {
        string responseValue = string.Empty;

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

        request.Method = httpMethod.ToString();

        HttpWebResponse response = null;
        // for un trusted servers
        System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

        try
        {
            using (response = (HttpWebResponse)request.GetResponse())
            {
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    throw new ApplicationException("error code " + response.StatusCode.ToString());
                }
            }

            //process the response stream ..(json , html , etc..  )
            Encoding enc = System.Text.Encoding.GetEncoding(1252);
            StreamReader loResponseStream = new
                StreamReader(response.GetResponseStream(), enc);

            responseValue = loResponseStream.ReadToEnd();
            loResponseStream.Close();
            response.Close();
        }
        catch (Exception ex)
        {
            throw ex;
        }



        return responseValue;
    }

4
response 只存在于 using 语句块的范围内......你正在尝试在外部访问它。将你的代码放到 using 语句块内即可。 - Elmer Dantas
@ElmerDantas 实际上不是这样的,response 在语句之前已经声明了。 - Abbas
你正在在using语句之外调用GetResponseStream。这肯定是有问题的,你不应该期望它能正常工作。我建议你编辑这个问题,将代码放在using语句内,并清楚描述发生了什么以及你已经采取了哪些步骤来诊断它。(你确定服务器确实返回了数据吗?)而且,这与visual-studio或.net-framework-version标签有什么关系也不清楚。 - Jon Skeet
@Abbas确实,但他正在调用GetResponseStream,这个方法只存在于using语句块内部。 - Elmer Dantas
@ElmerDantas 对象(已经)存在,只是已经被释放了。这是两件不同的事情。 - Abbas
3个回答

10
第一个using块正在处理您的响应。将此块后面的代码移动到using语句中。

5
在这一行:
StreamReader loResponseStream = new StreamReader(response.GetResponseStream(), enc);

您正在尝试访问response,但该对象已被using语句处理掉了。

编辑:

这段代码应该可以工作,它会处理所有的对象并返回值:

using (HttpWebResponse  response = (HttpWebResponse)request.GetResponse())
{
    if (response.StatusCode != HttpStatusCode.OK)
    {
        throw new ApplicationException("error code " + response.StatusCode.ToString());
    }

    Encoding enc = System.Text.Encoding.GetEncoding(1252);

    using(StreamReader loResponseStream = new StreamReader(response.GetResponseStream(), enc))
    {
        return loResponseStream.ReadToEnd();
    }
}

允许从using语句返回,更多阅读:using语句(C#参考)

该网站的引用:

使用using语句可以确保在调用对象方法时发生异常时也会调用Dispose。您可以通过将对象放入try块中,然后在finally块中调用Dispose来实现相同的结果; 实际上,这就是编译器如何翻译using语句的方式。


1

Look at this part:

using (response = (HttpWebResponse)request.GetResponse())
{
    if (response.StatusCode != HttpStatusCode.OK)
    {
        throw new ApplicationException("error code " +      response.StatusCode.ToString());
    }
 }

//process the response stream ..(json , html , etc..  )
Encoding enc = System.Text.Encoding.GetEncoding(1252);
StreamReader loResponseStream = new
StreamReader(response.GetResponseStream(), enc);

您在构建 StreamReader 时访问了 response,但这是在您的 using 声明之外。using 声明将处理 response 的释放,因此会出现错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接