如何从http请求中删除Content-Length标头?

问题描述 投票:0回答:2

我正在尝试将超过 2GB 的大文件上传到 IIS 上的 ASP.NET MVC 5。 我google了一下,发现IIS有2GB的http请求限制,而MS还没有修复它。

我在以下链接中找到了使用 StreamContent 类和 HttpContext.Current.Request.GetBufferlessInputStream(true) 的解决方法; (参见 Priyanka 的回答)

超出 IIS 7.5 和 .NET 中的 2GB 文件上传限制

我确认,如果在 http 请求中仅未设置 Content-Length 标头,它就可以工作。

因此,我成功使用 PostMan 上传了一个超过 2GB 的文件,其中 Content-Length 标头未选中。


然而,我的现实世界应用程序使用 HTML/Javascript 上传文件,并且始终设置 Content-Length 标头,尽管我更改了 web.config,但 IIS 将 http 请求视为错误请求。

所以,我正在寻找一种方法来剥离(删除)http 请求中的 Content-Length 标头。 我发现了一个提示,可能可以通过 IIS Url Rewrite 实现。

您能否让我知道如何使用 IIS Url Rewrite 剥离(删除)http 请求中的 Content-Length 标头?

致以诚挚的问候。

asp.net iis asp.net-web-api url-rewrite-module
2个回答
0
投票

某些请求标头我们无法使用 URL 重写规则或任何代码进行修改。 您可以尝试使用以下代码让iis上传更大的文件:

<requestFiltering>
    <requestLimits maxAllowedContentLength="4294967295"/>
  </requestFiltering>
  <httpRuntime executionTimeout="2400" maxRequestLength="2147483647"/>

0
投票

无法使用 IIS Url Rewrite 修改 Content-Length。并且编辑 Web.config 并不能帮助克服 2GB 限制。 幸运的是,在现代 Javascript 世界中,您可以使用 FileReader,更重要的是,您可以读取块并直接发送它们。

工作 jQuery 示例:

var file = $("input[type=file]")[0].files[0];
var offset = 0;
var chunkSize = 104857600;//100 MB
var fileReader = new FileReader();
var uploadNextChunk = function () {
    if (offset < file.size)
        fileReader.readAsArrayBuffer(file.slice(offset, offset + chunkSize));
};
fileReader.onload = function () {
    $.ajax({
        type: "POST",
        url: "AjaxUpload.ashx?fileName=" + encodeURIComponent(file.name),
        data: new Blob([fileReader.result]),
        processData: false,
        contentType: false,
        success: function () {
            offset += chunkSize;
            uploadNextChunk();
        }
    });
};
uploadNextChunk();

和 C# 处理程序:

    public void ProcessRequest(HttpContext context)
    {
        string path = @"Files\";
        string fileName = context.Request.QueryString.Get("fileName");
        using (FileStream fileStream = File.Open(path + fileName, FileMode.Append, FileAccess.Write))
        {
            context.Request.GetBufferlessInputStream(true).CopyTo(fileStream);
        }
    }

并检查 Web.config 中的 maxAllowedContentLength。它必须不小于选定的 chunkSize:

<requestLimits maxAllowedContentLength="104857600" />
© www.soinside.com 2019 - 2024. All rights reserved.