ASP.NET Core 9.0 中新增的MapStaticAssets() 中间件
前言
在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 3.0中使用动态控制器路由
原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...
- 探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs
原文:探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs 前言:.NET Core 3.0 SDK包含比以前版本更多的现成模板. 在本文中,我将 ...
- [翻译] ASP.NET Core 3.0 的新增功能
ASP.NET Core 3.0 的新增功能 全文翻译自微软官方文档英文版 What's new in ASP.NET Core 3.0 本文重点介绍了 ASP.NET Core 3.0 中最重要的更 ...
- 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation
前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...
- asp.net core 5.0 中的 JsonConsole
asp.net core 5.0 中的 JsonConsole Intro asp.net core 5.0 中日志新增了 JsonConsole,还是输出日志到 Console,但是会应用 Json ...
- ASP.NET Core 1.0 中的依赖项管理
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- 在ASP.NET Core 1.0中如何发送邮件
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:目前.NET Core 1.0中并没有提供SMTP相关的类库,那么要如何从ASP.NE ...
- ASP.NET Core 1.0 中使用 Swagger 生成文档
github:https://github.com/domaindrivendev/Ahoy 之前文章有介绍在ASP.NET WebAPI 中使用Swagger生成文档,ASP.NET Core 1. ...
- 用ASP.NET Core 1.0中实现邮件发送功能
准备将一些项目迁移到 asp.net core 先从封装类库入手,在遇到邮件发送类时发现在 asp.net core 1.0中并示提供SMTP相关类库,于是网上一搜发现了MailKit 好东西一定要试 ...
- 在ASP.NET Core 2.0中使用CookieAuthentication
在ASP.NET Core中关于Security有两个容易混淆的概念一个是Authentication(认证),一个是Authorization(授权).而前者是确定用户是谁的过程,后者是围绕着他们允 ...
随机推荐
- Angular 18+ 高级教程 – Memory leak, unsubscribe, onDestroy
何谓 Memory Leak? Angular 是 SPA (Single-page application) 框架,用来开发 SPA. SPA 最大的特点就是它不刷新页面,不刷新就容易造成 memo ...
- Angular Material 18+ 高级教程 – CDK Accessibility の Focus
介绍 CDK Focus 是对原生 DOM focus 的上层封装和扩展. Focus Origin 原生 DOM focus 我们只能知道 element 被 focus 了,但是无法知道它是怎么被 ...
- Razor 常用又容易忘记语法
1. <text> 要写 text 可以用这个特殊 element @:  @: 也是一个可以写 text 的方式 2. @Html.Raw($@"<s ...
- Go runtime 调度器精讲(十):异步抢占
原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 前面介绍了运行时间过长和系统调用引起的抢占,它们都属于协作式抢占.本讲会介绍基于信号的真抢占式调度. 在介绍真抢占式调度之前看下 Go 的两种抢 ...
- Git常用命令,分支合并与管理
Git 自我感觉最大的优点是对版本库和分支的管理 各自的电脑都对项目保存一份版本,分支合并也极其方便. 而且Git的目录操作命令跟Linux一样,使用起来还是非常顺手的. Git详解 Git 常用命令 ...
- 自己动手,通过源码找回 Ant-Design-Blaozr 中 Tree 组件的搜索筛选效果
最近更新一个Blazor server的项目,顺带把用到的Ant-Design-Blazor 升级到了最新的 0.14.4,结果发现之前在 0.8.4 版本中 Tree 组件的搜索显示效果变了,从仅显 ...
- mysql-存储过程(二)-逻辑判断语句
一,if语句: IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为e ...
- OpenGL和OpenCL区别
1.OpenGL用于图形渲染程序:OpenCL用于复杂的计算.他们都是由Khronos管理并使用C语言编译. 2.OpneGL使编程能够进行图形操作:OpenCL使编程能够在多个处理器中进行计算. 3 ...
- CNN每层卷积结果视觉展示(3Dircadb肝脏数据为例)
试着展示了肝脏每层卷积之后的结果.代码如下: import torch import torch.nn as nn import SimpleITK as sitk import numpy as n ...
- Nodejs C++插件(N-API)
Nodejs C++插件(N-API) 0. 环境搭建 1. JS中调用C++方法 1.1 JS中调用源文件的C++方法 1.2 JS中调用动态库的C++方法 2. C++中调用JS方法 2.1. C ...