2011-05-02 25 views
3

我使用HttpWebResponse.GetResponseStream來訪問互聯網廣播流,並且想要從響應流中讀取一些數據,然後斷開連接。但是,我總是無限期地掛在流的Dispose上。下面的單元測試將顯示「正在清理networkStream ...」,但從未達到「完成」。爲什麼是這樣?我應該修復它只是不打擾我的networkStream的處置?HttpWebResponse GetResponseStream掛在配置

[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"); 
} 

回答

3

編輯:剛剛發現了一個解決方案...的using塊結束之前調用req.Abort()。不是很優雅,但它的作品......於是代碼變得:

[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"); 
} 

嘗試配置的 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"); 
} 

應該處置 NetworkStream爲好。

+0

這一個掛過 - 我沒有得到「完成」 – 2011-05-02 09:29:57

+0

就試了一下,我得到這個URL相同的結果...怪異 – 2011-05-02 09:34:54

+0

@馬克荒地,看到我更新的答案 – 2011-05-02 10:24:02