【问题标题】:ObjectDisposedException in HttpWebRequestHttpWebRequest 中的 ObjectDisposedException
【发布时间】:2017-04-28 13:07:29
【问题描述】:

我在 Compact 框架中创建了一个 Web 请求

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("Url");

using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
     streamWriter.Write("body");

using (HttpWebResponse response = httpWebRequest.GetResponse() as HttpWebResponse)
using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
{
     string json = streamReader.ReadToEnd();
}

我得到一个ObjectDisposedException。 我将这个错误归咎于response.GetResponseStream(),但是这段代码有什么问题?

堆栈跟踪是

System.ObjectDisposedException 
ObjectDisposedException-   at System.Threading.Timer.throwIfDisposed()
   at System.Threading.Timer.Change(UInt32 dueTime, UInt32 period)
   at System.Threading.Timer.Change(Int32 dueTime, Int32 period)
   at System.Net.HttpWebRequest.ConnectionClient.Read(Byte[] data, Int32 offset, Int32 length)
   at System.Net.HttpReadStream.NetworkRead(Byte[] data, Int32 offset, Int32 length)
   at System.Net.ContentLengthReadStream.doRead(Byte[] data, Int32 offset, Int32 length)
   at System.Net.HttpReadStream.ReadToDrain(Byte[] buffer, Int32 offset, Int32 length)
   at System.Net.HttpReadStream.doClose()
   at System.Net.ContentLengthReadStream.doClose()
   at System.Net.HttpReadStream.Finalize()

【问题讨论】:

    标签: c# .net httpwebrequest compact-framework webrequest


    【解决方案1】:

    我怀疑这是由于您处置了StreamWriter,而后者又处置了请求流。我不知道这对请求本身有什么影响,但我猜这就是事情失败的地方。

    您始终可以使用 Reflector 深入研究 BCL 以查看究竟发生了什么,但尝试这样的测试可能会更快、更容易:

    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("Url");
    StreamWriter streamWriter;
    try
    {
        streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        streamWriter.Write("body");
    
        using (HttpWebResponse response = httpWebRequest.GetResponse() as HttpWebResponse)
        using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
        {
            string json = streamReader.ReadToEnd();
        }
    }
    finally
    {
        streamWriter.Dispose();
    }
    

    【讨论】:

    • 您好,“写方法”使用GetRequestStream,而“读”使用GetResponseStream。这些是在 HttpWebRequest 中常见的内部处理?
    • 我不确定它们是如何在内部处理的。正如我所建议的,您可以使用 Reflector 检查 BCL 源代码,但尝试上面的代码可能会更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2012-06-03
    相关资源
    最近更新 更多