ASP.NET Core 9.0 中新增的MapStaticAssets() 中间件详解
作者:万雅虎
文章介绍了ASP.NET Core 9.0新增的MapStaticAssets中间件,该中间件解决了UseStaticFiles存在的缺陷,如缺乏静态资源传输压缩、ETag低效缓存和缺乏指纹识别,它通过生成时间压缩、基于内容的ETags和指纹识别来提升性能,感兴趣的朋友一起看看吧
前言
在Core 9.0
版本中新增的内容不算多,除了内置OpenAPI 外 应该就属MapStaticAssets
中间件最有价值了,最初MapStaticAssets主要是为了解决Blazor
静态资源加载缓慢而生的,当然只要是wwwroot
下的任何静态资产都是可以使用TA平替UseStaticFiles
的,因此在了解了TA的优势后 建议升级到9.0的小伙伴都使用TA平替UseStaticFiles!
既有缺陷
通常,在我们既有的NETCore项目中,我们都是使用UseStaticFiles
中间件来提供静态资产,不过TA存在以下的一些缺陷:
- 缺乏静态资源的传输压缩 (当然,可以搭配压缩中间件,或者容器压缩(如IIS动态压缩))
- 使用ETag进行低效缓存(依赖于文件修改时间戳,因此内容不变时间戳变更将会导致重新加载)
- 缺乏指纹识别(浏览器可能会缓存和重复使用旧版本的资产,从而导致应用更新后出现不一致,影响用户体验)
解决问题
MapStaticAssets
旨在解决上述UseStaticFiles存在的一些缺陷:
- 为应用中的所有资产生成时间压缩:
- 在开发期间
gzip
,在发布期间 gzip +brotli
- 所有资产都经过压缩,目标是将资产大小降到最低。
- 基于内容的 ETags:每个资源的 Etags 都是内容的
SHA-256
哈希的 Base64 编码字符串。 这可确保浏览器仅在文件内容发生更改时重新下载文件。 - 指纹识别资源,通过资源唯一标识,可以防止浏览器重复使用旧版本。当应用程序更新时,指纹会发生变化,从而确保客户端始终收到最新的资产。
在MapStaticAssets
内部的请求管道中TA做了下面这些事:
- 设置 ETag 和 Last-Modified 标头。
- 设置缓存标头。
- 使用 Caching Middleware。
- 如果可能,提供压缩的静态资产。
性能提升
下表显示了默认的 Razor Pages 模板中 CSS 和 JS 文件的原始大小和压缩大小:
文件 | 原始 | 压缩 | %缩减 |
---|---|---|---|
bootstrap.min.css | 163 | 17.5 | 89.26% |
jquery.js | 89.6 | 28 | 68.75% |
bootstrap.min.js | 78.5 | 20 | 74.52% |
总计 | 331.1 | 65.5 | 80.20% |
在使用Blazor
开发业务系统时将节省大量传输宽带,极大的提升加载速度
不可替部分
当然UseStaticFiles
仍然有TA不可替代的部分,比如虚拟文件提供者(如,嵌入的资产,其他磁盘路径资源,或网络资源等)
比如资源是嵌入到程序集的情况下你仍然必须使用:
var embeddedFileProvider = new EmbeddedFileProvider(typeof(ISetting).Assembly, "Biwen.Settings"); app.UseStaticFiles(new StaticFileOptions { FileProvider = embeddedFileProvider, OnPrepareResponse = ctx => { ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=3600"); } });
结论
强烈建议在可替换UseStaticFiles()
的情况下使用MapStaticAssets()
到此这篇关于ASP.NET Core 9.0 中新增的MapStaticAssets() 中间件的文章就介绍到这了,更多相关ASP.NET Core 中间件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!