如何在自托管环境中对 ASP.NET Core 中的静态内容进行 gzip

2024-04-03

使用自托管环境发布 ASP.NET Core 网站时,是否有方法提供 gzip 静态内容?


[编辑2016-11-13]

还有另一种方式来提供 gzip 压缩文件来替代步骤 2 和 3。它基本上是相同的想法,但是有一个 nugetpackage https://www.nuget.org/packages/CompressedStaticFiles这一切都可以为您轻松完成。它基本上检查是否是.gz or .br与所请求的文件相匹配的文件。如果存在,它将返回并带有适当的标头。它确实验证请求是否具有相应算法的标头。如果你想自己编译的话Github代码是here https://github.com/AnderssonPeter/CompressedStaticFiles.

官方也有一个问题可以支持这一点存储库 https://github.com/aspnet/StaticFiles/issues/7,所以我真的希望微软能够有标准插件来做到这一点,因为现在使用它是相当普遍和合乎逻辑的。


我想我已经找到了提供压缩内容的最优化方式。主要思想是预压缩文件,由于默认的 ASP.NET 5 方式是使用 gulp 构建 js,因此很容易做到:

1. 添加 gulp 步骤来 gzip 捆绑的库:

gulp.task("buildApplication:js", function () {
    return gulp.src(...)
        ...
        .pipe(gzip()) 
        ...
});

这将在您的包文件夹中生成类似libraries.js.gz 的内容

2.在cshtml文件中引用libraries.js.gz而不是libraries.js

3.修改静态文件处理程序以修复返回的标头

我们需要添加Content-Encoding并改变Content-Type从默认application/x-gzip to application/javascript因为并非所有浏览器都足够聪明,可以正确读取 jsx-gzip

app.UseStaticFiles(new StaticFileOptions
    {
        OnPrepareResponse = context =>
        {  
            if (headers.ContentType.MediaType == "application/x-gzip")
            {
                if (context.File.Name.EndsWith("js.gz"))
                {
                    headers.ContentType = new MediaTypeHeaderValue("application/javascript");
                }
                else if (context.File.Name.EndsWith("css.gz"))
                {
                    headers.ContentType = new MediaTypeHeaderValue("text/css");
                }

                context.Context.Response.Headers.Add("Content-Encoding", "gzip");
            }
        }
    });

现在,不再需要浪费 CPU 周期来始终对相同的内容进行 gzip,这是提供文件服务的最佳性能。为了进一步改进它,所有的 js 都必须在 gzip 之前被捆绑和缩小。另一个升级是在同一个OnPrepareResponse中设置CacheControl max Age缓存一年并添加asp-append-version="true"在cshtml中。

附:如果您将托管在 IIS 之后,您可能需要关闭 js 和 css 的静态压缩而不是双重压缩,我不确定在这种情况下它会如何表现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在自托管环境中对 ASP.NET Core 中的静态内容进行 gzip 的相关文章

随机推荐