2012-11-27 21 views
2

我工作的下載管理器項目 ,我使用:返回的GetResponseStream輸出到其他功能,怎麼樣處置輸入反應

public Stream GetStream(string url) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    return response.GetResponseStream(); 
} 

然後使用返回流作爲輸入流的FileStream作爲輸出流同時聲明:

Stream InputStream = GetStream("http://test_url/test.zip"); 
Stream OutputStream = new FileStream("d:\\test.zip", FileMode.Create, FileAccess.Write)); 
do 
{ 
    readSize = InputStream.Read(buffer, 0, buffSize); 
    OutputStream.Write(buffer, 0, (int)readSize); 
} 
while (readSize > 0); 
用我256kpps連接 後約20下載超過50MB的文件時

- 30 MB,READSIZE沒有錯誤成爲0

我的問題是: Response對象有什麼問題嗎? 或者是什麼問題?

非常感謝您, 如果我不能更好地解釋,我很抱歉。

+1

你的意思是類似於你的問題 - 是你的代碼或者它不是你正在運行的代碼。如果您提供您正在使用的實際代碼 – PyNEwbie

+0

,您將需要發佈實際代碼,但您提供的示例沒有任何意義。你爲什麼要試圖從Response流中讀取數據?這意味着要寫。 –

+0

嗨,我編輯了我的帖子,所以我認爲現在很清楚,因爲@ steve-py:我認爲響應流是爲了閱讀; – Omar

回答

1

您不會處置您的HttpWebRequest/HttpWebResponse對象,這可能會導致問題 - 對同一服務器的併發連接數存在內置限制。

你應該做這樣的事情:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
using(HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
    using(Stream responseStream = response.GetResponseStream()) 
    { 
     using(Stream outputStream = new FileStream(...)) 
     { 
      responseStream.CopyTo(outputStream); 
     } 
    } 
} 

Stream.CopyTo是在.NET 4.0中新。如果您使用.NET < = 3.x,則需要使用write your own

+0

謝謝@Joe,但你在一個地方完成所有工作,我的問題是關於在另一個函數中分割請求和響應,並使用它返回的流在另一個地方。關於處理:我實際上是這樣做的,所以我很擔心響應流與它自己的響應是分開的,因爲流不能再讀取。 – Omar