解决HTTP2下载失败网络错误

Solve HTTP2 Download Failed Network Error

提问人:seewhathadhappenedwas 提问时间:7/22/2017 最后编辑:Dale Kseewhathadhappenedwas 更新时间:2/15/2023 访问量:2647

问:

环境

  • ASP.NET 网站
  • .NET 4.6.1
  • 在 Windows Server 上的 IIS 10.0 中托管 2016.

Web.Config:

<modules runAllManagedModulesForAllRequests="true">
  <remove name="FormsAuthentication" />
</modules>

按钮点击:

protected void btnDownload_Click(object sender, System.EventArgs e)
{
    try
    {
        string sPDFFilename = "doc.pdf";    
        byte[] data = GetData();            
        Response.ClearHeaders();
        Response.ClearContent();
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "Attachment; filename=" + sPDFFilename);
        Response.AddHeader("content-length", (data.Length.ToString()));
        Response.BinaryWrite(data);
        Response.Flush();
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }
    catch(Exception ex){ throw; }
}

问题:在第一次回发时,浏览器使用HTTP2作为其协议,下载失败。Chrome 网站“网络错误 - 下载失败"

再次单击同一链接,协议将回退到 http/1.1,下载成功。

  • 当前语法是否适用于在 HTTP2 下交付文件?
  • 是否可以在 IIS10/ASP.NET 4.6.1 中强制使用 http/1.1?
C# asp.net http2 IIS-10

评论

0赞 Morten OC 8/20/2017
我们有完全相同的问题!它只发生在 Chrome 中。
2赞 seewhathadhappenedwas 9/8/2017
我们暂时在服务器上禁用了 HTTP/2,直到我们能够解决我们的问题。stackoverflow.com/questions/31668151/......
0赞 AlvaroV 3/22/2021
我已将SSRS移动到具有HTTPS的新服务器,在下载报告时,它给了我这个问题。添加 HttpContext.Current.Response.End();在 Flush() 之后,它工作得很好!
0赞 Shaybakov 6/20/2021
HKLM\System\CurrentControlSet\Services\HTTP\Parameters 添加 dword Http2MaxConcurrentClientStreams 值 100

答:

0赞 Henri Kulotie 2/15/2023 #1

在 HTTP2 中,如果文件名包含非 US-ASCII 字符,则大多数浏览器将无法解析文件名。HTTP1.1 的实现对此更加宽松。

要仍然支持 utf-8 文件名,您可以使用带有 url 编码值的 filename* 属性。

目前最支持的 Content-Disposition 格式是:

attachment; filename="<us-ascii filename>"; filename*=utf-8''<url-encoded-utf-8-filename>

即。

attachment; filename="EURO rates"; filename*=utf-8''%e2%82%ac%20rates