C# 使用HttpWebRequest上载大文件(AllowWriteSteamBuffering无法解决此问题)
我的问题如下: 我目前正在广泛测试我的应用程序,现在我知道它无法处理大文件的上传。当然,我告诉自己这个问题,并且C# 使用HttpWebRequest上载大文件(AllowWriteSteamBuffering无法解决此问题),c#,http,post,file-upload,upload,C#,Http,Post,File Upload,Upload,我的问题如下: 我目前正在广泛测试我的应用程序,现在我知道它无法处理大文件的上传。当然,我告诉自己这个问题,并且AllowWriteStreamBuffering-属性已经设置为false,但是当我尝试上载大小约为700 Mb的文件时,我的电脑冻结(我有4 Gb RAM,并且没有MemoryOutOfRangeException)。我既不能使用HttpClient-类,因为我必须提供对.NET Framework 4的支持,也不能阻止上载,因为目标服务器不支持这种上载。 我认为内存问题是因为我已
AllowWriteStreamBuffering
-属性已经设置为false,但是当我尝试上载大小约为700 Mb的文件时,我的电脑冻结(我有4 Gb RAM,并且没有MemoryOutOfRangeException
)。我既不能使用HttpClient
-类,因为我必须提供对.NET Framework 4的支持,也不能阻止上载,因为目标服务器不支持这种上载。
我认为内存问题是因为我已经发送(上传时)的数据仍然分配在RAM中。
这些代码行负责:
while ((bytesRead = fileStream.Read(fileBuffer, 0, fileBuffer.Length)) != 0)
{
requestStream.Write(fileBuffer, 0, (int)bytesRead);
}
如何删除已发送但仍在使用内存的数据?
如果这不是问题的原因,那么我该如何解决呢?我尝试了几种方法,一种内部分块上传(但是
HttpWebRequest
的chunked
-属性是false
)可以工作:
long bytesRead=0;
长拆分字节=1000000;//≈ 1 Mb
int数据包=(int)Math.天花((double)file.FileSize/splitBytes);
FileStream FileStream=newfilestream(file.Path,FileMode.Open,FileAccess.Read);
byte[]fileBuffer=新字节[splitBytes];
Stream requestStream=request.GetRequestStream();
Write(postBuffer,0,postBuffer.Length);
while(fileStream.Read(fileBuffer,0,fileBuffer.Length)!=0)
{
如果(字节读取+拆分字节)“后缓冲区”是什么?
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);
}
}