Out of Memory-Ausnahme Bei der Verwendung von HttpWebRequest-Streaming einer Großen Datei
Bekomme ich eine Out of Memory-Ausnahme bei der Verwendung von Http.Setzen einer großen Datei. Ich bin mit einem asynchronen Modell wie im code gezeigt. Ich bin versucht, senden 8 Kb-Blöcke der Daten auf einem Windows 2008 R2 server. Die Ausnahme konsequent Auftritt, wenn ich Versuch zu schreiben, ein block von Daten, das übersteigt 536,868,864 bytes. Die Ausnahme tritt auf die requestStream.Write-Methode in der code-snippet unten.
Suche nach Gründen, warum?
Hinweis: Kleinere Dateien werden OK. Logik funktioniert auch, wenn ich Schreibe einen lokalen FileStream. Läuft VS 2010, .Net 4.0 auf Win 7 Ultimate client-computer.
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();
}
}
- Macht das gleiche geschieht mit der POST? Funktioniert der code tatsächlich Daten gesendet werden?
- Möchten Sie vielleicht zu schauen .NET 4 neue
CopyTo()
Methode für streams
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheinbar dieses problem dokumentiert. Wenn
AllowWriteStreamBuffering
isttrue
es Puffer alle Daten geschrieben, um die Anfrage! Also, die "Lösung" zu setzen, ist, dass diese Eigenschaftfalse
: