【发布时间】:2015-07-13 22:00:13
【问题描述】:
我正在开发一个文件上传经常发生的应用程序,并且文件大小可能非常大。
这些文件正在上传到 Web API,然后它将从请求中获取流,并将其传递给我的存储服务,然后将其上传到 Azure Blob 存储。
我需要确保:
- 没有温度。文件写在 Web API 实例上
- 请求流在传递到存储服务之前未完全读入内存(以防止内存不足异常)。
我查看了this article,它描述了如何禁用输入流缓冲,但是由于来自许多不同用户的许多文件上传同时发生,所以它实际上按照它在锡上所说的去做是很重要的。
这是我目前在控制器中的内容:
if (this.Request.Content.IsMimeMultipartContent())
{
var provider = new MultipartMemoryStreamProvider();
await this.Request.Content.ReadAsMultipartAsync(provider);
var fileContent = provider.Contents.SingleOrDefault();
if (fileContent == null)
{
throw new ArgumentException("No filename.");
}
var fileName = fileContent.Headers.ContentDisposition.FileName.Replace("\"", string.Empty);
// I need to make sure this stream is ready to be processed by
// the Azure client lib, but not buffered fully, to prevent OoM.
var stream = await fileContent.ReadAsStreamAsync();
}
我不知道如何可靠地测试这个。
编辑:我忘了说直接上传到 Blob 存储(绕过我的 API)是行不通的,因为我正在做一些大小检查(例如,这个用户可以上传 500mb 吗?这个用户有吗?用了他的配额?)。
【问题讨论】:
-
您是否尝试过将输入流直接复制到 blob 存储?
-
这就是我正在做的事情,但我需要确保在 blob 存储客户端开始上传之前我没有完全缓冲输入流,而且我不知道如何测试它是否真的发生了。
-
您是否尝试过分析您的应用以查看它是否在读取之前对其进行缓冲?
-
获取memory profiler 并测试您的应用。
-
我发现该文件在发送到 Azure 之前确实已复制到内存中。这是个问题。
标签: c# asp.net azure asp.net-web-api azure-storage