【问题标题】:How to GZIP Compress CSS Files When Server Pushed via HTTP/2 in IIS 10在 IIS 10 中通过 HTTP/2 推送服务器时如何 GZIP 压缩 CSS 文件
【发布时间】:2020-09-09 16:49:19
【问题描述】:

我是服务器在 ASP.NET MVC 站点中推送一些 CSS 文件,就像这样在控制器中:

public ActionResult Index()
{
    var cssToPush = new[]
    {
        "/bundle/file1.min.css",
        "/bundle/file2.min.css",
    };
    foreach (var file in cssToPush)
    {
        Response.PushPromise(file);
    }
    return View(GetModel());
}

执行此操作时,我在 Chrome 网络选项卡中看到 CSS 文件未使用 GZIP 压缩,它们使用的是 44KB。

当我跳过服务器推送时,CSS 文件使用 GZIP 压缩,它们使用 14KB。

我的理论是,这是因为服务器不一定知道客户端是否会接受 GZIP 压缩,因此它会以未压缩的资产进行响应。但是,我认为这是非常常见的,并且必须有一些标准方法来启用服务器推送资产的 GZIP 压缩。我会考虑在文件系统上手动 GZIP 压缩它们是非标准且繁琐的。

其他信息:

  • 一些新的 Windows Server 实例(我认为是 Windows Server 2016 或 2019)上的 IIS 10。
  • 我正在使用 HTTPS 并在网络选项卡中确认了“h2”(即 HTTP/2)。
  • 我确认文件正在被服务器推送到网络选项卡的“发起者”列中。

【问题讨论】:

    标签: asp.net-mvc iis gzip


    【解决方案1】:

    虽然我不知道您是否仍然遇到此问题,但为我解决的方法是将 Accept-Encoding 标头传递回响应中。

    var values = new NameValueCollection();
    values.Add("Accept-Encoding", filterContext.HttpContext.Request.Headers.Get("Accept-Encoding"));             
    filterContext.HttpContext.Response.PushPromise("~/wwwroot/dist/push_asset.css", "GET", values);    
    

    【讨论】:

    • 哦,有趣!所以你告诉它它可以接受什么,这样它就会做出适当的反应。我认为这是有道理的;将在我的下一个项目中尝试,谢谢!
    • 在使用 http/2 或这种接受编码方法推送时,您是否体验过 IIS 10 快速故障保护?我将它应用于两个站点,似乎都可以工作,但是快速故障保护每周启动 2-3 次并且服务停止。我不知道这是否与添加这些标头有关,或者一般来说是 http/2 PushPromise。 (仍在试验 - 在事件查看器或自定义错误日志中没有任何用处)
    【解决方案2】:

    您可以尝试使用 iis 静态和动态内容压缩。

    在 web.config 文件中添加以下代码:

    <system.webServer>
    <httpCompression directory="%SystemDrive%\inetpub\
    temp\IIS Temporary Compressed Files">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
    <add mimeType="text/*" enabled="true"/>
    <add mimeType="message/*" enabled="true"/>
    <add mimeType="application/javascript" enabled="true"/>
    <add mimeType="*/*" enabled="false"/>
    </dynamicTypes>
    <staticTypes>
    <add mimeType="text/*" enabled="true"/>
    <add mimeType="message/*" enabled="true"/>
    <add mimeType="application/javascript" enabled="true"/>
    <add mimeType="*/*" enabled="false"/>
    </staticTypes>
    </httpCompression>
    <urlCompression doStaticCompression="true" doDynamicCompression="true"/>
    </system.webServer>
    

    【讨论】:

    • 我不认为是这样,因为静态(例如 CSS)和动态(例如 HTML 主页)资产都已经被 GZIP 压缩了。服务器推送时,静态资产没有被压缩。
    • @NicholasWestby 您可以尝试运行失败的请求跟踪以获取更多详细信息。 docs.microsoft.com/en-us/iis/troubleshoot/…
    • 不确定我是否理解这会有什么帮助。请求没有失败。它们只是没有被压缩。
    猜你喜欢
    • 2017-04-06
    • 1970-01-01
    • 2020-03-24
    • 2013-12-23
    • 2011-10-23
    • 2014-11-10
    • 2017-10-11
    • 1970-01-01
    • 2017-09-06
    相关资源
    最近更新 更多