2

我有一个允许用户上传图像的 ASP.Net MVC 应用程序。当我尝试上传一个非常大的文件 (400MB) 时,我收到一个错误。

我认为我的图像处理代码(自制)效率非常低,所以我决定尝试使用第三方库来处理图像处理部分。

因为我使用的是 TDD,所以我想先写一个失败的测试。但是当我用同一个大文件测试控制器动作时,它能够毫无问题地完成所有图像处理。

我得到的错误是“内存不足”。

我确定我的代码使用的内存可能比它需要的多得多,但我只想知道为什么我的测试通过了。

另一个区别是我使用的是未用于测试的 SWFUpload。这可能是原因吗?

4

5 回答 5

4

可以在 web.config 或 machine.config 或两者中配置内存限制。

在 web.config 中,该部分是:

<httpRuntime 
executionTimeout="3600" 
maxRequestLength="102400"
/>

在 machine.config 中,该部分也可以是 httpRunTime 部分,类似于:

<httpRuntime 
executionTimeout="90" 
maxRequestLength="4096"
useFullyQualifiedRedirectUrl="false" 
minFreeThreads="8" 
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100"
/>

也可以使用 processModel 部分将 aspnet 进程限制为总内存的百分比,请参阅:

http://msdn.microsoft.com/en-us/library/7w2sway1.aspx

我遇到了与您描述的这些设置引起的类似问题。
特别是 ProcessModel memorylimit 属性。

于 2009-02-08T16:02:13.690 回答
1

上传大小确实没有硬性限制。但是,如果您使用的是 32 位进程,您可能会受到 asp.net 工作进程可以处理的内存量的限制。一旦达到 800mb 左右,它就会变得非常不稳定。

Bravax 提到的超时设置也是检查的好地方。

为使用 TDD 干杯!

于 2009-02-08T16:04:54.060 回答
1

来自MSDN

防止拒绝服务攻击的一种方法是使用 FileUpload 控件限制可以上传的文件的大小。您应该设置适合您希望上传的文件类型的大小限制。默认大小限制为 4096 千字节 (KB) 或 4 兆字节 (MB)。您可以通过设置 httpRuntime 元素的 maxRequestLength 属性来允许上传较大的文件。要增加整个应用程序的最大允许文件大小,请在 Web.config 文件中设置 maxRequestLength 属性。要增加指定页面的最大允许文件大小,请在 Web.config 中的 location 元素内设置 maxRequestLength 属性。有关示例,请参阅位置元素(ASP.NET 设置架构)。

上传大文件时,用户可能还会收到以下错误消息:

aspnet_wp.exe (PID: 1520) 被回收,因为内存消耗超过 460 MB(可用 RAM 的 60%)。

如果您的用户遇到此错误消息,请在应用程序的 Web.config 文件的 processModel 元素中增加 memoryLimit 属性的值。memoryLimit 属性指定工作进程可以使用的最大内存量。如果工作进程超过 memoryLimit 数量,则会创建一个新进程来替换它,并将所有当前请求重新分配给新进程。

于 2009-02-08T16:13:42.513 回答
0

异常究竟来自哪里?

AFAIK ASP.net/.Net 中的图像大小没有 400MB 口径限制。我正在编写一个项目,其中一些文件要大得多。当然,可能有一些我不知道的更高限制,但它看起来很奇怪和随意。

你是在 64 位机器上运行的吗?您的图像文件 - 未压缩(在 jpg 中是 400MB 吗?) - 测试您的进程地址空间的 2GB 限制吗?

于 2009-02-08T15:44:43.990 回答
0

您需要确保将输入流中的数据通过管道传输到某种形式的文件流中,以便内存中不需要整个请求实体。

于 2009-02-08T16:11:52.953 回答