我有一个ASP.Net MVC应用程序,允许用户上传图像。当我尝试上传一个非常大的文件(400MB)时,我收到了一个错误。
我认为我的图像处理代码(家庭酿造)效率非常低,因此我决定尝试使用第三方库来处理图像处理部件。
因为我正在使用TDD,所以我想先写一个失败的测试。但是当我使用相同的大文件测试控制器动作时,它能够毫无困难地完成所有图像处理。
我得到的错误是“内存不足”。
我确信我的代码可能使用的内存比它需要的多得多,但我只是想知道为什么我的测试通过了。
另一个区别是我使用的SWFUpload不用于测试。这可能是原因吗?
答案 0 :(得分: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属性。
答案 1 :(得分:1)
上传大小确实没有硬性限制。但是,如果您使用的是32位进程,则可能会受到asp.net工作进程可以解决的内存量的限制。一旦它达到800mb左右,就会变得非常不稳定。
Bravax提到的超时设置也是一个值得检查的好地方。
欢呼使用TDD!
答案 2 :(得分:1)
来自MSDN:
防止拒绝服务攻击的一种方法是使用FileUpload控件限制可以上载的文件的大小。您应该设置适合您希望上载的文件类型的大小限制。默认大小限制为4096千字节(KB)或4兆字节(MB)。您可以通过设置httpRuntime元素的maxRequestLength属性来允许上载更大的文件。要增加整个应用程序的最大允许文件大小,请在Web.config文件中设置maxRequestLength属性。要增加指定页面的最大允许文件大小,请在Web.config中的location元素内设置maxRequestLength属性。有关示例,请参阅location元素(ASP.NET设置架构)。
上传大文件时,用户可能还会收到以下错误消息:
aspnet_wp.exe(PID:1520)被回收,因为内存消耗超过460 MB(可用RAM的60%)。
如果您的用户遇到此错误消息,请在应用程序的Web.config文件的processModel元素中增加memoryLimit属性的值。 memoryLimit属性指定工作进程可以使用的最大内存量。如果工作进程超过memoryLimit量,则会创建一个新进程来替换它,并将所有当前请求重新分配给新进程。
答案 3 :(得分:0)
异常究竟来自何处?
AFAIK ASP.net/.Net中的图像尺寸没有400MB级别的限制。我正在编写一个项目,其中一些文件要大得多。当然,可能会有一些我不知道的更高限制,但它看起来很奇怪和随意。
你在64位机器上运行吗?您的图像文件可以 - 未压缩(jpg中是400MB吗?) - 测试进程地址空间的2GB限制?
答案 4 :(得分:0)
您需要确保将输入流中的数据传输到某种形式的文件流中,以便内存中不需要整个请求实体。