2012-07-24 120 views
2

我正在嘗試讀取500 MB文本文件以通過HttpWebRequest發送內容。根據我的要求,我無法以大塊的形式發送數據。代碼如下:內存不足異常 - 爲HttpWebRequest讀取大文本文件

using (StreamReader reader = new StreamReader(filename)) 
{ 
    postData = reader.ReadToEnd(); 
} 

byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
request.ContentType = "text/plain"; 
request.ContentLength = byteArray.Length; 

Stream dataStream = request.GetRequestStream(); 
dataStream.Write(byteArray, 0, byteArray.Length); 
dataStream.Close(); 

WebResponse response = request.GetResponse(); 
Console.WriteLine(((HttpWebResponse)response).StatusDescription); 

dataStream = response.GetResponseStream(); 

using (StreamReader reader = new StreamReader(dataStream)) 
{ 
    responseFromServer = reader.ReadToEnd(); 
} 

Console.WriteLine(responseFromServer); 
dataStream.Close(); 
response.Close(); 

讀這樣大的文件會給我內存不足的例外。有什麼辦法可以做到這一點?

+0

爲什麼你不能以大塊的形式發送它?那究竟是什麼意思?你的意思是你不能使用[chunked transfer encoding](http://en.wikipedia.org/wiki/Chunked_transfer_encoding)或其他的東西? – svick 2012-07-25 00:03:03

+0

@svick:我的意思是我發送數據的URL應該只產生一個響應..這相當於一份工作。所以我希望將發送的數據作爲一項工作。 – kanu 2012-07-25 00:22:36

回答

1

聽起來像你可能會遇到this documented issue with HttpWebRequest。根據知識庫文章,嘗試將HttpWebRequest.AllowWriteStreamBuffering屬性設置爲false

+0

嘗試了您的建議。作品不錯..謝謝。但是,現在我在閱讀服務器響應時出現錯誤。給我System.Net.ProtocolViolationException錯誤:「在調用[Begin] GetResponse」錯誤之前,您必須將ContentLength字節寫入請求流 。 – kanu 2012-07-25 13:54:34

+0

也許這裏接受的答案也適用於你:http://stackoverflow.com/questions/7124797/httprequest-and-post – sellmeadog 2012-07-25 16:13:23

1

所有的文件都以塊的形式傳輸 - 這就是以太網數據包;它是一個單一的數據塊。我敢打賭,這個要求確實意味着「這個文件必須在一個Web服務調用中傳輸」。

假設是這種情況,您需要將數據從磁盤讀取到64KB緩衝區中,然後將緩衝區寫入請求。

request.ContentType = "text/plain"; 
request.ContentLength = byteArray.Length; 
Stream dataStream = request.GetRequestStream(); 
int BUFFER_SIZE = 65536; 
byte[] buffer = new byte[BUFFER_SIZE]; 
using (StreamReader reader = new StreamReader(filename)) { 
    int count = 0; 
    while (true) { 
     int count = reader.Read(buffer, 0, BUFFER_SIZE); 
     dataStream.Write(buffer, 0, count); 
     if (count < BUFFER_SIZE) break; 
    } 
} 
dataStream.Close(); 
+0

我基本上不想從服務器產生多個響應。我想FileStream或緩衝區應該解決大文件的問題...... – kanu 2012-07-25 00:34:17

+0

正確,緩衝不會導致「多個來自服務器的響應」,並且它將確保您的調用可以成功,即使文件的大小增加超過您可用的內存量。 – 2012-07-25 04:43:25