Исключение нехватки памяти при использовании HttpWebRequest для потоковой передачи больших файлов

Я получаю исключение нехватки памяти при использовании Http.Put для большого файла. Я использую асинхронную модель, как показано в коде. Я пытаюсь отправить блоки данных размером 8 КБ на сервер Windows 2008 R2. Исключение постоянно возникает, когда я пытаюсь записать блок данных, превышающий 536 868 864 байта. Исключение возникает в методе requestStream.Write во фрагменте кода ниже.

Ищете причины, почему?

Примечание: файлы меньшего размера можно ВЫБРАТЬ ОК. Логика также работает, если я пишу в локальный FileStream. Запуск VS 2010, .Net 4.0 на клиентском компьютере Win 7 Ultimate.

   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();
        }
    }
7
задан pearcewg 6 June 2011 в 01:23
поделиться