【问题标题】:Is there a way to ignore the maxRequestLength limit of 2GB file uploads?有没有办法忽略 2GB 文件上传的 maxRequestLength 限制?
【发布时间】:2012-10-19 05:55:12
【问题描述】:

这里我将 maxRequestLength 设置为 2GB(最大值),这表示 ASP.NET 支持的最大请求大小:

<system.web>
    <httpRuntime maxRequestLength="2097151" executionTimeout="3600"/>
    ...

这里我将maxAllowedContentLength 设置为 4GB(最大值),它指定了 IIS 支持的请求中内容的最大长度

<system.webServer>
    <security>
        <requestFiltering>
            <requestLimits maxAllowedContentLength="4294967295"/>
        </requestFiltering>
    </security>
    ...

我希望能够上传最大 4GB 的文件,但我受到 maxRequestLength 字段的限制。

我注意到这个第三方上传工具 (http://www.element-it.com/onlinehelp/webconfig.html) 有一个ignoreHttpRuntimeMaxRequestLength 属性,允许它上传最大 4GB 的文件。

有人知道我是否可以像其他上传工具一样忽略maxRequestLength 值吗?

【问题讨论】:

  • 你用什么上传?据我了解,您可以使用分块传输编码来上传大于 2GB 的文件,因为分块传输编码不包含内容长度标头,因此不使用 maxRequestLength。据我了解,大多数浏览器不支持分块传输编码。
  • 试试这个:stackoverflow.com/a/12056417/551744。我用 JavaScript 实现了拆分文件并在服务器端合并它们。这也有帮助:html5rocks.com/ru/tutorials/file/dndfiles

标签: c# asp.net iis iis-7


【解决方案1】:

您应该能够通过像这样将相同的节点添加到应用程序的 web.config 中来覆盖 machine.config 中的设置。微软有一些关于ASP.NET Configuration File Hierarchy and Inheritance的信息。

注意: Erik Philips 是正确的,maxRequestLength 的最大大小为 2,147,483,647 (Int32.MaxValue)。这个答案是为了说明如何从应用程序的 web.config/

中覆盖 machine.config(或任何 .config)中定义的设置
<configuration>
    ...
    <system.web>
        <httpRuntime maxRequestLength="2147483647"/>
    ...
    ...
    </system.web>
    ...
</configuration>

不过,在执行此操作时,您可能还想增加超时时间,或者它可能会超时。

【讨论】:

    【解决方案2】:

    考虑到MaxRequestLength的Type是Int,目前没有办法正确解析高于Int.Max的值。

    我听说他们可能会增加 IIS8,但微软目前还没有具体的消息。我在 .Net 4.5 中看到的唯一方法是使用 HttpRequest.GetBufferlessInputStream

    获取可用于读取传入 HTTP 实体正文的 Stream 对象,可选择禁用 MaxRequestLength 属性中设置的请求长度限制。

    【讨论】:

    • 好点,我没有意识到 maxRequestLengthint 而不是 uint。将其设置为 uint 会更有意义,因为您的请求长度永远不会是负数。
    • 据我了解微软修复了 ASP.NET 上传限制但没有修复 IIS:aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/…
    • MaxRequestLength 以 KB 为单位,最大值为 2 TB 而不是 GB。这不是问题,而是正常缓冲输入流以及多部分表单数据解析器等在超过 2GB 时崩溃的事实。解决它的唯一方法是真正的 GetBufferlessInputStream 并自己解析请求。
    • @poizan42 是的,然而 maxAllowedContentLength 是以字节为单位的 UINT,所以最大值似乎是 4gb。
    • 是的,但是请注意,您可以通过从您的站点中完全删除 RequestFilteringModule 来摆脱它。之后,您开始遇到 ASP.NET ISAPI 模块在大于 MAX_UINT 的 Content-Length 标头上失败的问题,因为它们坚持在移交给您的代码之前对其进行解析。我通过使用重写规则删除 Content-Length 标头来解决它(首先将其保存在服务器变量中)。之后,您需要使用 HttpWorkerRequest 直接读取请求。
    【解决方案3】:

    就我而言,这些是我需要应用的更改:

    <system.web>
        <httpRuntime targetFramework="4.6.1" maxRequestLength="2147483647" />
    </system.web>
    
    <system.webServer>
         <serverRuntime uploadReadAheadSize="2147483647" />
         <security>
            <requestFiltering>
               <requestLimits maxAllowedContentLength="2147483647" />
            </requestFiltering>
         </security>
    </system.webServer>
    

    为了添加serverRuntime,请按照this question的第一个答案中的说明进行操作

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 2020-07-02
      • 2015-04-17
      • 2021-05-18
      • 2015-04-06
      • 2011-04-30
      相关资源
      最近更新 更多