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
InformationsquelleAutor pearcewg | 2011-06-06
Schreibe einen Kommentar