【问题标题】:GZip compression not working for ASP.NET Core 2.2 application hosted on Azure App ServiceGZip 压缩不适用于 Azure 应用服务上托管的 ASP.NET Core 2.2 应用程序
【发布时间】:2020-01-25 14:48:54
【问题描述】:

我有一个在 Azure 应用服务上运行的 ASP.NET Core 2.2 应用程序。

我遇到的问题是应用程序的响应没有被压缩(没有 Content-Encoding 标头)。

我对 App Service 的理解是,我的应用程序会在 IIS 后面运行 Out of Process,所以 IIS 应该是负责压缩响应的东西。我的理解也是,应用服务上的 IIS 应该默认配置为使用 gzip 自动压缩 JavaScript 和 CSS 等文件类型,但是这不会发生。

发送到服务器的请求都有正确的accept-encoding头,所以不是浏览器的问题(我也用多个浏览器检查过)。

我已尝试在web.config 中明确设置 urlCompression:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    </system.webServer>
  </location>
</configuration>

但这没什么区别。

我也尝试将 IIS.Compression.SiteExtension 安装到应用服务,但也没有启用压缩。

我知道我可以在我的应用程序中直接使用Response Compression Middleware,但我更愿意让 IIS 处理它。

简而言之,我的问题是如何让压缩(GZIP 或 Brotli)在应用服务中为我的应用程序工作?

【问题讨论】:

  • 您使用的是 HTTPS 吗?由于潜在的 CRIME 和 BREACH 攻击,通过 HTTPS 进行通信时默认禁用压缩。在 ASP.NET Core 中有一种方法可以覆盖,但在 IIS/App 服务端不确定。
  • 是的,它通过 HTTPS。我想知道这是否与此有关,但我在任何地方都找不到任何文档来说明 Azure App Service 正在做什么以及如何为某些文件覆盖它(因为我相信 CRIME 和 BREACH 攻击会影响动态生成的内容包含秘密但不是静态的非秘密文件,例如 JS 和 CSS,但如果我错了请纠正我)
  • 没有。这与基于压缩工作方式的事实有关,它使 SSL 加密本质上不太安全。这并不意味着您不安全,老实说,我认为现代 TLS 密码 (1.2+) 通常不太容易受到影响。不过,这是一种权衡,您必须决定什么更重要:安全性或客户端必须下载的数据量。

标签: asp.net-core azure-web-app-service asp.net-core-2.2


【解决方案1】:

我已经尝试过。默认情况下,即使使用 HTTPS 协议,也会在 Azure 上启用压缩。

要解决此问题,您需要捕获失败的请求跟踪日志。在日志中,它会告诉您为什么压缩不起作用,如下所示:

原因说明见底部this page

要捕获失败的请求跟踪日志,请按照以下步骤操作:

a) 在 Azure 门户中启用“失败的请求跟踪”:

b) 在 web.config 的“system.webServer”部分添加下面的配置

<tracing>
 <traceFailedRequests>
 <remove path="*" />
 <add path="*">
  <traceAreas>
   <add provider="ASP" verbosity="Verbose" />
   <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
   <add provider="ISAPI Extension" verbosity="Verbose" />
   <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,FastCGI" verbosity="Verbose" />
  </traceAreas>
  <failureDefinitions statusCodes="200" />
 </add>
</traceFailedRequests>
</tracing>

使用此设置,它将捕获所有带有 200 状态码的请求。

3、通过FTP或KUDU(推荐)在web app的root\LogFiles\W3SVCXXX文件夹中找到日志。文件名类似于“fr000001.xml”。 在 KUDU 页面中,点击“下载”按钮将打开登录友好视图。在日志中搜索“压缩”。这是一个成功的例子:

【讨论】:

    猜你喜欢
    • 2019-05-06
    • 1970-01-01
    • 2019-11-20
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2020-05-19
    相关资源
    最近更新 更多