ASP.NET Core 9.0 中新增的MapStaticAssets() 中间件详解

 更新时间:2024年12月03日 09:10:51   作者:万雅虎  
文章介绍了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.css16317.589.26%
jquery.js89.62868.75%
bootstrap.min.js78.52074.52%
总计331.165.580.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 中间件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • asp.net 页面传值的几个方法

    asp.net 页面传值的几个方法

    在网页应用程序的开发中,页面之间的传值应该是最常见的问题了。
    2009-11-11
  • .NET6自定义WebAPI过滤器

    .NET6自定义WebAPI过滤器

    这篇文章介绍了.NET6自定义WebAPI过滤器的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • asp.net中List的使用方法

    asp.net中List的使用方法

    .net真是方便,这几天帮朋友写了个小软件,用它还真感觉轻松自在,很称手,自带的类库既丰富又实用
    2008-10-10
  • 详解Func<T>与Action<T>区别

    详解Func<T>与Action<T>区别

    本文主要介绍Func<T>和Action<T>的用法以及他们之间的区别,希望对大家有所帮助
    2016-11-11
  • ASP.NET MVC API 接口验证的示例代码

    ASP.NET MVC API 接口验证的示例代码

    本篇文章主要介绍了ASP.NET MVC API 接口验证的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • GridView多层嵌套和折叠与展开(修改适合自己使用)

    GridView多层嵌套和折叠与展开(修改适合自己使用)

    这个功能的GridView多层嵌套没有问题,因为已经做了无限次数,但是折叠与展开的功能,却花上不少时间(网上找资料),虽找到资料可参考,还是了解明它,并修改适合自己程序使用,感兴趣的朋友可以了解下
    2013-01-01
  • ASP.NET操作EXCEL的总结篇

    ASP.NET操作EXCEL的总结篇

    今年有个系统的部分EXCEL的操作也让我做,顺便结合之前操作EXCEL的经验作一下总结,可能也算不上什么,对于绝大多数来说也没什么技术含量,网上一搜一大把,但我想还是有必要总结一下
    2011-02-02
  • asp.net 存储过程调用

    asp.net 存储过程调用

    调用存储过程,但无返回值 调用存储过程,返回普通值 调用存储过程,返回数据集的实现代码。
    2009-07-07
  • asp.net下大文件上传知识整理

    asp.net下大文件上传知识整理

    asp.net下大文件上传知识整理...
    2007-03-03
  • ASP.NET session.timeout设置案例详解

    ASP.NET session.timeout设置案例详解

    这篇文章主要介绍了ASP.NET session.timeout设置案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论