【问题标题】:Is there any memory restrictions on an ASP.Net application?ASP.Net 应用程序有内存限制吗?
【发布时间】:2009-02-08 15:23:36
【问题描述】:

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

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

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

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

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

另一个区别是我使用的是 SWFUpload,它不用于测试。会不会是这个原因?

【问题讨论】:

标签: asp.net large-files out-of-memory swfupload


【解决方案1】:

可以在 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 属性。

【讨论】:

  • 进程模型内存限制看起来很有趣,但我在我的开发机器上找不到 machine.config。我不应该有一个吗?
  • 这取决于您使用的 .net 框架的版本。在这里试试:C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG
  • 配置文件中的设置不限制内存,它限制了请求的大小。如果请求太大,页面将无法运行,因此无法抛出异常。
【解决方案2】:

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

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

为使用 TDD 干杯!

【讨论】:

    【解决方案3】:

    来自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 数量,则会创建一个新进程来替换它,并将所有当前请求重新分配给新进程。

    【讨论】:

      【解决方案4】:

      异常究竟来自哪里?

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

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

      【讨论】:

      • 我在 64 位机器上。我认为它来自 Graphics.DrawImage()。我首先从文件中创建一个位图,并认为这会占用内存。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2018-11-03
        • 2013-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        相关资源
        最近更新 更多