當使用大型文件的Http.Put時,出現「內存不足」異常。我正在使用代碼中顯示的異步模型。我試圖將8K數據塊發送到Windows 2008 R2服務器。當我嘗試寫入超過536,868,864字節的數據塊時,將始終發生異常。下面的代碼片段中的requestStream.Write方法發生異常。當使用HttpWebRequest來流式傳輸大文件時,內存溢出異常
尋找原因爲什麼?
注意:較小的文件是PUT OK。如果我寫入本地FileStream,Logic也可以工作。在Win 7 Ultimate客戶端計算機上運行VS 2010,.Net 4.0。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("Http://website/FileServer/filename");
request.Method = WebRequestMethods.Http.Put;
request.SendChunked = true;
request.AllowWriteStreamBuffering = true;
...
request.BeginGetRequestStream(new AsyncCallback(EndGetStreamCallback), state);
...
int chunk = 8192; // other values give same result
....
private static void EndGetStreamCallback(IAsyncResult ar) {
long limit = 0;
long fileLength;
HttpState state = (HttpState)ar.AsyncState;
Stream requestStream = null;
// End the asynchronous call to get the request stream.
try {
requestStream = state.Request.EndGetRequestStream(ar);
// Copy the file contents to the request stream.
FileStream stream = new FileStream(state.FileName, FileMode.Open, FileAccess.Read, FileShare.None, chunk, FileOptions.SequentialScan);
BinaryReader binReader = new BinaryReader(stream);
fileLength = stream.Length;
// Set Position to the beginning of the stream.
binReader.BaseStream.Position = 0;
byte[] fileContents = new byte[chunk];
// Read File from Buffer
while (limit < fileLength)
{
fileContents = binReader.ReadBytes(chunk);
// the next 2 lines attempt to write to network and server
requestStream.Write(fileContents, 0, chunk); // causes Out of memory after 536,868,864 bytes
requestStream.Flush(); // I get same result with or without Flush
limit += chunk;
}
// IMPORTANT: Close the request stream before sending the request.
stream.Close();
requestStream.Close();
}
}
POST是否也發生同樣的情況?你的代碼是否真的發送了任何數據? – svick 2011-06-06 02:17:59
您可能想要查看.NET 4的新的流CopyTo()方法 – Cameron 2011-06-06 02:55:33