使用HttpWebRequest上传大文件(AllowWriteSteamBuffering不解决此问题)

使用HttpWebRequest上传大文件(AllowWriteSteamBuffering不解决此问题)

问题描述:

我的问题如下: 我目前正在广泛测试我的应用程序,现在我知道它无法处理上传的大文件。当然,我告诉自己这个问题,AllowWriteStreamBuffering - 属性已被设置为false,但是当我尝试上传一个大小为〜700 Mb的文件时,我的PC冻结了(我有4 Gb RAM,而且我没有得到一个MemoryOutOfRangeException)。我无法使用HttpClient-Class,因为我必须提供对.NET Framework 4的支持,也不能将上载分块,因为目标服务器不支持这种上载。 我认为内存问题是由于我已发送的数据(上传时)仍然分配在RAM中导致的。 这些代码行负责是:使用HttpWebRequest上传大文件(AllowWriteSteamBuffering不解决此问题)

while ((bytesRead = fileStream.Read(fileBuffer, 0, fileBuffer.Length)) != 0) 
{ 
    requestStream.Write(fileBuffer, 0, (int)bytesRead); 
} 

如何删除这已经发送,但是仍然使用我的内存中的数据? 如果这不是问题的原因,那我该如何解决呢?

我尝试了几种方法,以及一种内部分块上传(但HttpWebRequestChunked,物业是false)工作原理:

  long bytesRead = 0; 
      long splitBytes = 1000000; // ≈ 1 Mb 
      int dataPacks = (int)Math.Ceiling((double)file.FileSize/splitBytes); 
      FileStream fileStream = new FileStream(file.Path, FileMode.Open, FileAccess.Read); 
      byte[] fileBuffer = new byte[splitBytes]; 
      Stream requestStream = request.GetRequestStream(); 
      requestStream.Write(postBuffer, 0, postBuffer.Length); 
      while (fileStream.Read(fileBuffer, 0, fileBuffer.Length) != 0) 
      { 
       if (bytesRead + splitBytes <= file.FileSize) 
       { 
        requestStream.Write(fileBuffer, 0, fileBuffer.Length); 
        fileStream.Flush(); 
        bytesRead += splitBytes; 
       } 
       else 
       { 
        requestStream.Write(fileBuffer, 0, (int)(file.FileSize - bytesRead)); 
        fileStream.Flush(); 
        bytesRead += (file.FileSize - bytesRead); 
       } 
      } 

它的工作原理,甚至对不接受现实服务器分块上传。