Asp.net mvc 如何在IIS10中通过HTTP/2推送服务器时压缩CSS文件

Asp.net mvc 如何在IIS10中通过HTTP/2推送服务器时压缩CSS文件,asp.net-mvc,iis,gzip,Asp.net Mvc,Iis,Gzip,我正在ASP.NET MVC站点中的服务器上推送一些CSS文件,就像控制器中的这样: public ActionResult Index() { var cssToPush=new[] { “/bundle/file1.min.css”, “/bundle/file2.min.css”, }; foreach(cssToPush中的var文件) { 答复.PushPromise(文件); } 返回视图(GetModel()); } 当我这样做的时候,我在Chrome网络标签中看到CSS文件没有

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

public ActionResult Index()
{
var cssToPush=new[]
{
“/bundle/file1.min.css”,
“/bundle/file2.min.css”,
};
foreach(cssToPush中的var文件)
{
答复.PushPromise(文件);
}
返回视图(GetModel());
}
当我这样做的时候,我在Chrome网络标签中看到CSS文件没有使用GZIP压缩,而是使用44KB

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

我的理论是,这是因为服务器不一定知道客户端是否会接受GZIP压缩,所以它会使用未压缩的资产进行响应。然而,我认为这是非常常见的,必须有一些标准的方法来支持服务器推送资产的GZIP压缩。我认为手动GZIP在文件系统上压缩它们是非标准的和繁琐的。 其他资料:

  • 一些新的Windows Server实例(我认为是Windows Server 2016或2019)上的IIS 10
  • 我正在使用HTTPS,并在网络选项卡中确认了“h2”(即HTTP/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>

虽然我不知道您是否仍然存在此问题,但我解决此问题的方法是在响应中传递接受编码头

var values=new NameValueCollection();
Add(“接受编码”,filterContext.HttpContext.Request.Headers.Get(“接受编码”);
filterContext.HttpContext.Response.PushPromise(“~/wwwroot/dist/push\u asset.css”,“GET”,value);

我不这么认为,因为静态(如CSS)和动态(如HTML主页)资产都已经被压缩了。“服务器推送时,静态资产没有被压缩。@NicholasWestby您可以尝试运行失败的请求跟踪以获取更多详细信息。我不知道这会有什么帮助。请求没有失败。他们只是没有被压缩。哦,有趣!所以你告诉它可以接受什么,这样它就会做出适当的反应。我认为这是有道理的;将在我的下一个项目中试用,谢谢!使用http/2或此接受编码方法推送时,您是否遇到过IIS 10快速失败保护?我将其应用于两个站点,所有站点似乎都能正常工作,但快速故障保护每周启动2-3次,服务停止。我不知道这是否与添加这些头相关,或者与http/2协议有关。(仍在试验中-在事件查看器或自定义错误日志中没有任何用处)