是否有一种方法可以忽略最大请求长度限制,以上传2GB以上的文件?

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未被使用。我也了解到大多数浏览器不支持分块传输编码。 - jac
尝试使用这个链接:https://dev59.com/BGct5IYBdhLWcg3wgNcy#12056417。我意识到可以使用JavaScript拆分文件并在服务器端合并它们。这个链接也可能有所帮助:http://www.html5rocks.com/ru/tutorials/file/dndfiles/。 - Chaki_Black
3个回答

9
考虑到 MaxRequestLength 的类型是 Int,目前没有办法正确解析高于 Int.Max 的值。
我听说他们可能会在 IIS8 中增加,但迄今为止,Microsoft 还没有明确表示。在 .Net 4.5 中唯一看到的方法是使用 HttpRequest.GetBufferlessInputStream,该方法可以获取一个 Stream 对象,用于读取传入的 HTTP 实体主体,可以选择禁用 MaxRequestLength 属性中设置的请求长度限制。

1
好的,我没有意识到maxRequestLengthint而不是uint。它更应该是一个uint,因为请求长度永远不可能是负数。 - vane
据我所知,微软已经修复了ASP.NET的上传限制,但没有修复IIS:http://aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/2642879-maximum-upload-size-in-asp-net-is-2gb-increase-it - IT Hit WebDAV
1
MaxRequestLength以KB为单位,最大值为2TB而不是GB。这不是问题,但普通缓冲输入流以及所有的多部分表单数据解析器等在超过2GB时都会崩溃。唯一的解决方法就是使用GetBufferlessInputStream并自己解析请求。 - poizan42
1
是的,但请注意,您可以通过从站点中完全删除RequestFilteringModule来摆脱它。之后,您开始遇到ASP.NET ISAPI模块失败的问题,因为Content-Length标头大于MAX_UINT,他们坚持在将其交给您的代码之前对其进行解析。我通过使用重写规则来删除Content-Length标头(首先将其保存在服务器变量中)来解决了这个问题。之后,您需要使用HttpWorkerRequest直接读取请求。 - poizan42
@poizan42,您能告诉我如何使用IIS Url Rewrite模块在HTTP请求中删除Content-Length头吗? - Ivoryguard
显示剩余2条评论

1

在我的情况下,我需要应用以下更改:

<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,请按照此问题中第一个答案的说明操作。


-1

您应该能够通过将相同的节点添加到应用程序的web.config中来覆盖machine.config中的设置。Microsoft提供了关于ASP.NET配置文件层次结构和继承的一些信息。

注意:Erik Philips是正确的,maxRequestLength的最大大小为2,147,483,647(Int32.MaxValue)。本答案旨在说明如何从应用程序的web.config中覆盖在machine.config(或任何.config)中定义的设置。

<configuration>
    ...
    <system.web>
        <httpRuntime maxRequestLength="2147483647"/>
    ...
    ...
    </system.web>
    ...
</configuration>

在这样做的过程中,您可能还想增加超时时间,否则它可能会超时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接