在尝试创建非缓冲文件上传时,我扩展了System.Web.Http.WebHost.WebHostBufferPolicySelector,覆盖了本文所述的函数UseBufferedInputStream():http://www.strathweb.com/2012/09/dealing -with-large-files-in-asp-net-web-api /.当一个文件被POST到我的控制器时,我可以在跟踪输出中看到被覆盖的函数UseBufferedInputStream()肯定会按预期返回FALSE.但是,使用诊断工具,我可以看到内存随着文件上传而增长.
大量内存使用似乎发生在我的自定义MediaTypeFormatter中(类似于FileMediaFormatter:http://lonetechie.com/ ).在这个格式化程序中我想逐步将传入的文件写入磁盘,但我还需要解析json并使用Content-Type:multipart/form-data upload执行其他操作.因此我使用HttpContent方法ReadAsMultiPartAsync(),这似乎是内存增长的来源.我在"await"之前/之后放置了跟踪输出,并且看起来当任务阻塞时,内存使用量会相当快地增加.
一旦我在ReadAsMultiPartAsync()返回的部分中找到文件内容,我就使用Stream.CopyTo()将文件内容写入磁盘.这按预期写入磁盘,但不幸的是,此时源文件已经在内存中.
有没有人对可能出现的问题有任何想法?似乎ReadAsMultiPartAsync()正在缓冲整个帖子数据; 如果这是真的,为什么我们需要var fileStream = await 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() == …Run Code Online (Sandbox Code Playgroud) 我们正在使用UseStatusCodePagesWithReExecute中与设置一个简单的自定义中间件组合Response.StatusCode来500,成功地将用户引导至我们的自定义错误页上发生在MVC控制器例外.
但是,对于在razor/cshtml视图中发生的异常,UseStatusCodePagesWithReExecute不会将用户发送到我们的错误页面(尽管我们的自定义中间件会检测到这些异常Invoke()).
我们也尝试使用异常过滤器,但它只捕获控制器操作的异常,而不是视图.
如果异常来自视图,有没有办法将用户发送到我们的错误页面?