C# System.ObjectDisposedException:&x27;无法访问已处置的对象。';
这是我连接到不受信任的服务器的代码,但我总是收到这个错误。我将代码放在using语句中,但它不工作。返回空字符串 以前也尝试过并查看此问题的链接,但它不起作用C# System.ObjectDisposedException:&x27;无法访问已处置的对象。';,c#,.net,visual-studio,.net-framework-version,C#,.net,Visual Studio,.net Framework Version,这是我连接到不受信任的服务器的代码,但我总是收到这个错误。我将代码放在using语句中,但它不工作。返回空字符串 以前也尝试过并查看此问题的链接,但它不起作用 private String requestAndResponse(String url) { string responseValue = string.Empty; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
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;
}
使用块的第一个
是处理您的响应。使用
语句将此块后的代码移动到中。在此行:
StreamReader loResponseStream = new StreamReader(response.GetResponseStream(), enc);
您正试图访问响应
,但此对象已由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语句确保即使在调用对象上的方法时发生异常,也会调用Dispose。通过将对象放在try块中,然后在finally块中调用Dispose,可以获得相同的结果;事实上,编译器就是这样翻译using语句的
看看这部分:
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);
在构建流阅读器时,您正在访问响应
,但这不在使用语句的范围之内。using
语句将处理响应,因此会出现错误。response
仅存在于using
范围内……您试图在范围外访问它。将您的代码放入using
范围内。@elmerdanta实际上不是,response
在语句之前声明。您在using语句之外调用GetResponseStream
。这肯定是坏的,你不应该指望它会起作用。我建议您编辑此问题,以便在using
语句中显示包含此问题的代码,并更清楚地描述到底发生了什么,以及您采取了哪些步骤来诊断它。(您知道服务器正在返回数据吗?)也不清楚这与visual studio或.net framework版本标记有什么关系。@Abbas确实如此,但他正在调用GetResponseStream
,该对象将只存在于中,使用@elmerdanta对象(已经)存在时,它只会被处理掉。这是两件不同的事情。