简体   繁体   English

HttpWebResponse GetResponseStream 挂在 Dispose

[英]HttpWebResponse GetResponseStream hanging in Dispose

I am using HttpWebResponse.GetResponseStream to access an internet radio stream, and want to read some data from the response stream, and then disconnect.我正在使用HttpWebResponse.GetResponseStream访问网络电台 stream,并想从响应 stream 中读取一些数据,然后断开连接。 However, I always hang indefinitely on the Dispose of the stream.但是,我总是无限期地挂在 stream 的处置上。 The unit test below will display "Cleaning up networkStream...", but never get to "Finished".下面的单元测试将显示“Cleaning up networkStream...”,但永远不会到达“Finished”。 Why is this?为什么是这样? And should I fix it by just not bothering to Dispose of my networkStream?我应该通过不打扰我的networkStream来解决它吗?

[Test]
public void CanStreamMP3Radio()
{
    string url = @"http://radio.reaper.fm/stream/";
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

    int total = 0;
    byte[] buffer = new byte[1024];

    using(var networkStream = resp.GetResponseStream())
    {
        do
        {
            int bytesRead = networkStream.Read(buffer, 0, buffer.Length);
            Console.WriteLine("{0} bytesRead", bytesRead);
            total += bytesRead;
        } while (total < 16384);
        Console.WriteLine("Cleaning up networkStream...");
    }
    Console.WriteLine("Finished");
}

EDIT: just found a solution... call req.Abort() before the end of the using block.编辑:刚刚找到了一个解决方案......在using块结束之前调用req.Abort() Not very elegant, but it works... So the code becomes:不是很优雅,但它可以工作......所以代码变为:

[Test]
public void CanStreamMP3Radio()
{
    string url = @"http://radio.reaper.fm/stream/";
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
    {
        int total = 0;
        byte[] buffer = new byte[1024];

        var networkStream = resp.GetResponseStream();
        do
        {
            int bytesRead = networkStream.Read(buffer, 0, buffer.Length);
            Console.WriteLine("{0} bytesRead", bytesRead);
            total += bytesRead;
        } while (total < 16384);
        Console.WriteLine("Cleaning up HttpWebResponse...");
        req.Abort();
    }
    Console.WriteLine("Finished");
}

Try disposing the HttpWebResponse instead: 尝试处理 HttpWebResponse代替:

 [Test] public void CanStreamMP3Radio() { string url = @"http://radio.reaper.fm/stream/"; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse()) { int total = 0; byte[] buffer = new byte[1024]; var networkStream = resp.GetResponseStream(); do { int bytesRead = networkStream.Read(buffer, 0, buffer.Length); Console.WriteLine("{0} bytesRead", bytesRead); total += bytesRead; } while (total < 16384); Console.WriteLine("Cleaning up HttpWebResponse..."); } Console.WriteLine("Finished"); }

It should dispose the NetworkStream as well. 它也应该处理 NetworkStream

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 HttpWebResponse.GetResponseStream转换&lt;代替&lt;etc - HttpWebResponse.GetResponseStream converts &lt; instead of < etc HttpWebResponse.GetResponseStream()(似乎是)失败,没有异常 - HttpWebResponse.GetResponseStream() (seems to be) failing with no exception 寻找一种方法重写HttpWebResponse的GetResponseStream方法 - Looking for a way to override the GetResponseStream Method of HttpWebResponse 无法将HttpWebResponse.GetResponseStream()分配给Stream - Unable to assign HttpWebResponse.GetResponseStream() to Stream HttpWebResponse.GetResponseStream():什么时候传输响应体? - HttpWebResponse.GetResponseStream(): when is the response body transmitted? HttpWebResponse挂断 - HttpWebResponse hanging up 为什么HttpWebResponse上没有Dispose方法 - why is there no Dispose method on HttpWebResponse System.Net.HttpWebResponse.GetResponseStream()在WebException中返回截断的主体 - System.Net.HttpWebResponse.GetResponseStream() returns truncated body in WebException 使用HttpWebResponse :: GetResponseStream方法时接收不完整的数据 - Receiving incomplete data when using HttpWebResponse::GetResponseStream method 从c#中的HTTPWebResponse.GetResponseStream()上传到S3 - Upload to S3 from HTTPWebResponse.GetResponseStream() in c#
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM