在如本文中描述试图创建一个非缓冲文件上传我已经延长System.Web.Http.WebHost.WebHostBufferPolicySelector,覆盖函数UseBufferedInputStream(): http://www.strathweb.com/2012/09/dealing -with-大的文件,在-ASP网的Web-API / 。 当一个文件被贴到我的控制,我可以跟踪输出按预期的方式重写功能UseBufferedInputStream()肯定返回FALSE看到。 但是,使用诊断工具,我可以看到越来越多的文件,内存被上传。
沉重的内存使用量出现在我的自定义MediaTypeFormatter要发生的(有点像FileMediaFormatter这里: http://lonetechie.com/ )。 正是在这样的格式,我想以增量写入传入的文件到硬盘,但我也需要解析JSON和做一些其他的操作与内容类型:多部分/表单数据上传。 因此我使用HttpContent方法ReadAsMultiPartAsync(),它似乎是存储器增长的来源。 我把跟踪输出前/后的“等待”,看来,虽然任务是阻止内存使用量相当迅速增加。
一旦我发现通过ReadAsMultiPartAsync返回的部分文件内容(),我以文件内容写入到磁盘使用Stream.CopyTo()。 如预期,但不幸的是,源文件已经在内存由这点该写入磁盘。
有没有人有什么可能会错误的任何想法? 看来,ReadAsMultiPartAsync()正在缓冲后整体数据; 如果这是真的,为什么我们需要VAR FILESTREAM =等待fileContent.ReadAsStreamAsync()来获取文件内容是什么? 是否有另一种方式来完成零件的分裂不读他们到内存? 在我MediaTypeFormatter的代码看起来是这样的:
// save the stream so we can seek/read again later
Stream stream = await content.ReadAsStreamAsync();
var parts = await content.ReadAsMultipartAsync(); // <- memory usage grows rapidly
if (!content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
//
// pull data out of parts.Contents, process json, etc.
//
// find the file data in the multipart contents
var fileContent = parts.Contents.FirstOrDefault(
x => x.Headers.ContentDisposition.DispositionType.ToLower().Trim() == "form-data" &&
x.Headers.ContentDisposition.Name.ToLower().Trim() == "\"" + DATA_CONTENT_DISPOSITION_NAME_FILE_CONTENTS + "\"");
// write the file to disk
using (var fileStream = await fileContent.ReadAsStreamAsync())
{
using (FileStream toDisk = File.OpenWrite("myUploadedFile.bin"))
{
((Stream)fileStream).CopyTo(toDisk);
}
}