我在我的控制器上有一个动作,应该上传大(500mb - 2gb)文件。例如,
[HttpPost]
public void PostFile([FromUri]Guid uploadId)
{
...
}
在正文中,会执行一些检查(例如uploadId 是否存在),然后将HTTP 请求的发布正文写入磁盘(/network share)。
我以为我已经解决了这个问题,因为如果没有创建 uploadId,我可以通过抛出 HttpResponseException 几乎立即拒绝 HTTP 请求,但我刚刚发现即使在这种情况下,请求的正文也会完全上传到服务器并将 ASP.Net Temporary Files 文件夹保存到磁盘。这意味着客户端必须完全上传文件(大约需要 5-10 分钟)才能发现它已被服务器拒绝。
我该如何避免这种情况?有什么方法可以防止 IIS 将正文写入磁盘,并允许控制器处理流?我发现客户端开始上传和请求命中我自己的代码之间有 5 分钟的延迟令人沮丧,因为 ASP.Net 必须做自己的事情并将上传写入本地磁盘。
编辑
有人问我如何读取上传数据。本质上,使用这种方法:
/// <summary>
/// Saves the current request's upload stream to the proivded path.
/// </summary>
/// <param name="destinationPath">The path to save to.</param>
/// <returns></returns>
private async Task<FileInfo> SaveUploadToDiskAsync(string destinationPath)
{
using (var httpContent = Request.Content)
{
using (FileStream fileStream = new FileStream(destinationPath, FileMode.Create, FileAccess.Write, FileShare.None, 8192, true))
{
await httpContent.CopyToAsync(fileStream);
return new FileInfo(destinationPath);
}
}
}