ASP.NET Core中预压缩静态文件的方法步骤

前言

Web应用程序的优化是非常重要,因为使用更少的CPU,占用更少的带宽可以减少项目的费用。 在ASP.NET Core中我们可以很容易的启用响应压缩,但是针对预压缩文件,就需要做一些额外的功能了。 这篇博客文章展示了如何在ASP.NET Core中预压缩静态文件。

下面话不多说了,来一起看看详细的介绍吧

为什么需要预压缩文件?

虽然在从服务器请求文件时, 我们可以动态压缩文件,但这意味这Web服务器需要做更多的额外工作。 其实只有在新的应用程序部署时才会更改要压缩的文件。 越好的压缩效果需要CPU做的工作就越多。

这个事实让我们产生一个疑问:是否有可能在不对其进行反复压缩的情况下提供这些文件? 幸运的是,这个问题答案是肯定的 - 是的,我们可以在ASP.NET Core中通过扩展静态文件中间件来做到这一点。

创建预压缩文件

为了让整个演示尽量简单,我们可以使用7-Zip来压缩磁盘上的静态文件。 以下是压缩默认ASP.NET Core MVC应用程序的site.css文件时7-Zip的对话框窗口。

这里你可能注意到我启用了Ultra压缩。这显然不是我们希望在Web服务器上动态压缩的方法,因为它太消耗CPU了。

正常情况下,这里可以使用Gulp来完成文件捆绑和收缩的功能,本文中暂时不会介绍这个。

提供压缩文件

这里我参考了Stack Overflow上的一个简单解决方案(How to gzip static content in ASP.NET Core in a self host environment.)。它处理了Javascript和CSS文件。

app.UseStaticFiles(new StaticFileOptions
{
  OnPrepareResponse = context =>
  {
    IHeaderDictionary headers = context.Context.Response.Headers;
    string contentType = headers["Content-Type"];
    if (contentType == "application/x-gzip")
    {
      if (context.File.Name.EndsWith("js.gz"))
      {
        contentType = "application/javascript";
      }
      else if (context.File.Name.EndsWith("css.gz"))
      {
        contentType = "text/css";
      }
      headers.Add("Content-Encoding", "gzip");
      headers["Content-Type"] = contentType;
    }
  }
});

当然Javascript和CSS文件并不是唯一需要压缩的文件类型。所以这里我们不能把contentType写死。这里我采用了.NET Core Tutorials站点中提供的一个解决方案( Getting A Mime Type From A File Name In .NET Core)。对我来说这个方案已经足够简单。

var provider = new FileExtensionContentTypeProvider();
string contentType;
if (!provider.TryGetContentType(fileName, out contentType))
{
  contentType = "application/octet-stream";
}

这里我把2个方案合并在里一起,产生了最终解决方案。

var mimeTypeProvider = new FileExtensionContentTypeProvider();

app.UseStaticFiles(new StaticFileOptions
{
  OnPrepareResponse = context =>
  {
    var headers = context.Context.Response.Headers;
    var contentType = headers["Content-Type"];

    if (contentType != "application/x-gzip" && !context.File.Name.EndsWith(".gz"))
    {
      return;
    }

    var fileNameToTry = context.File.Name.Substring(0, context.File.Name.Length - 3);

    if (mimeTypeProvider.TryGetContentType(fileNameToTry, out var mimeType))
    {
      headers.Add("Content-Encoding", "gzip");
      headers["Content-Type"] = mimeType;
    }
  }
});

至此,使用以上的代码,本文的主题就被解决了。

针对那些想直接使用现成库的开发人员,可以使用Nuget直接下载Peter Andersson做好的中间件。

Install-Package CompressedStaticFiles -Version 1.0.4

总结

虽然使用预压缩文件不是Web开发的主流,但它仍然可以节省CPU和带宽。 压缩静态文件可以作为ASP.NET Core应用程序构建的一个步骤。 尽管ASP.NET Core开箱即不支持预压缩文件,但我们依然可以通过扩展静态文件中间件,使其支持预压缩文件。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • ASP.NET Core静态文件使用教程(9)

    在这一章,我们将学习如何使用文件.几乎每个web应用程序都需要一个重要特性:能够从文件系统提供文件(静态文件). 静态文件像JavaScript文件.图片.CSS文件等,我们Asp.Net Core应用程序可以直接提供给客户. 静态文件通常位于web根(wwwroot)文件夹. 默认情况下,这是我们可以直接从文件系统提供文件的唯一的地方.  案例 现在让我们通过一个简单的示例来了解我们在我们的应用程序如何提供这些静态文件. 在这里,我们想要向我们的 FirstAppDemo 应用程序添加一个简单

  • 解析如何利用一个ASP.NET Core应用来发布静态文件

    虽然ASP.NET Core是一款"动态"的Web服务端框架,但是在很多情况下都需要处理针对静态文件的请求,最为常见的就是这对JavaScript脚本文件.CSS样式文件和图片文件的请求.针对不同格式的静态文件请求的处理,ASP.NET Core为我们提供了三个中间件,它们将是本系列文章论述的重点.不过在针对对它们展开介绍之前,我们照理通过一些简单的实例来体验一下如何在一个ASP.NET Core应用中发布静态文件. 目录 一.以Web的形式读取文件 二.浏览目录内容 三.显示默认页面

  • ASP.NET Core静态文件的使用方法

    前言 静态文件(HTML,CSS,图片和Javascript之类的资源)会被ASP.NET Core应用直接提供给客户端. 静态文件通常位于网站根目录(web root) <content-root>/wwwroot文件夹下.通常会把项目的当前目录设置为Content root,这样项目的web root就可以在开发阶段被明确. public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.Cre

  • .Net Core中间件之静态文件(StaticFiles)示例详解

    一.介绍 静态文件(static files),诸如 HTML.CSS.图片和 JavaScript 之类的资源会被 ASP.NET Core 应用直接提供给客户端. 在介绍静态文件中间件之前,先介绍 ContentRoot和WebRoot概念. ContentRoot:指web的项目的文件夹,包括bin和webroot文件夹. WebRoot:一般指ContentRoot路径下的wwwroot文件夹. 介绍这个两个概念是因为静态资源文件一般存放在WebRoot路径下,也就是wwwroot.下面

  • c# .Net Core静态文件服务器的新人入门教程

    概要: 本文通过示例,讲解了 NET Core2.0 静态文件目录的相关知识,并附带解析,适合新手,并附带了完整的项目代码.(项目通过 vs2017 初始化的 ASP.NET Core 应用程序,之后选择***空项目***) 示例代码 项目结构 program.cs文件 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks;

  • ASP.NET Core中预压缩静态文件的方法步骤

    前言 Web应用程序的优化是非常重要,因为使用更少的CPU,占用更少的带宽可以减少项目的费用. 在ASP.NET Core中我们可以很容易的启用响应压缩,但是针对预压缩文件,就需要做一些额外的功能了. 这篇博客文章展示了如何在ASP.NET Core中预压缩静态文件. 下面话不多说了,来一起看看详细的介绍吧 为什么需要预压缩文件? 虽然在从服务器请求文件时, 我们可以动态压缩文件,但这意味这Web服务器需要做更多的额外工作. 其实只有在新的应用程序部署时才会更改要压缩的文件. 越好的压缩效果需要

  • ASP.NET Core中Razor页面的Handlers处理方法详解

    简介 在前一篇文章中,我们讨论了Razor页面.今天我们来谈谈处理方法(Handlers). 我们知道可以将代码和模型放在 .cshtml 文件里面或与 .cshtml 匹配的 .cshtml.cs 文件中. Razor页面处理程序或处理方法将用户请求匹配到我们的方法:请求来自 **.cshtml **文件. Razor页面遵循特定的命名约定.从上一篇文章可以看出,.NET Core开发工具自动生成了很多处理方法,例如下面这些: OnGet OnPost OnGetAsync OnPostAsy

  • 详解Django模版中加载静态文件配置方法

    1.settings.INSTALLED_APPS下添加:django.contrib.staticfiles 2.settings.py下添加:STATIC_URL = '/static/' 3. (1)在APP下新建文件夹static,然后在这个static文件夹下创建一个当前APP的名字的文件夹,再把静态文件放到这个文件夹下:(类似于Templates配置) 在模板中这样调用: {% load static %} <img src="{% static 'front/logo.jpg

  • ASP.NET Core中快速构建PDF文档的步骤分享第1/2页

    比如我们需要ASP.NET Core 中需要通过PDF来进行某些简单的报表开发,随着这并不难,但还是会手忙脚乱的去搜索一些资料,那么恭喜您,这篇帖子会帮助到您,我们就不会再去浪费一些宝贵的时间. 在本文中我们将要使用DinkToPDF来处理我们在.NET Core Web 程序中进行构建PDF文档!就现在我们不多说,直接开始有趣的部分. 前言# 您可以通过创建PDF文档在我的仓库中,获取源代码,欢迎给个免费的Star... 现在我们创建一个.NET Core 3.0 项目,至于是mvc.Api.

  • ASP.NET Core中实现全局异常拦截的完整步骤

    前言 异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理,我会用一些 样例代码 和 截图 来说明这些概念. 全局异常处理 其实在 ASP.Net Core MVC 框架中已经有了全局异常处理的机制,你可以在一个中心化的地方使用 全局异常处理中间件 来进行异常拦截,如果不用这种中心化方式的话,你就只能在 Controller 或者 Action 作用域上单独处理,这会导致异常处理代码零散在项目各

  • 如何在Windows Vista中预览PDF文件的方法

    之前我们曾介绍过Windows Vista的预览功能,即在用户不打开相应文件的情况下查看文件的具体内容,这是个相当有用的功能,可以大大提高日常工作的效率.Windows Vista预览功能可支持的对象包括图片.音频.视频.字体.文本.E-mail乃至Office文档如Word.Excel.PowerPoint文件. 不过,对于PDF(Portable Document Format)文件,则没有这么幸运了,即使在Windows Vista中安装了可以创建PDF的Office 2007后,仍然不能

  • PHP中实现生成静态文件的方法缓解服务器压力

    互联网快速普及的现在社会,越来越多的人会在一个web应用上进行交流,因而导致服务器与数据库访问压力与日俱增,这边就需要进行一些优化,譬如增加缓存.二级缓存.动态网页静态化以及其他的高端技术. 此处作者是使用生成静态文件的方法: 复制代码 代码如下: /** * @desc 生成静态文件时使用 * @todo htmlcache * @param $root string html文件存放路径 * @param $rule string html文件命名规则 * @param $url strin

  • django模板加载静态文件的方法步骤

    加载静态文件 在一个网页中,不仅仅只有一个 html 骨架,还需要 css 样式文件, js 执行文件以及一些图片等.因此在 DTL 中加载静态文件是一个必须要解决的问题.在 DTL 中,使用 static 标签来加载静态文件.要使用 static 标签,首先需要 {% load static %} .加载静态文件的步骤如下: 首先确保 django.contrib.staticfiles 已经添加到 settings.INSTALLED_APPS 中. 确保在 settings.py 中设置了

  • webpack中如何加载静态文件的方法步骤

    前言: 对于非静态的文件,如js,当webpack打包时,会被直接打到模块文件中,如main.js,如果修改了,需要再次编译 而对于静态文件,如jpg,svg等,我们不希望webpack去打包,只需要在build完后,直接放到dist下的某个路径下即可,随时可以修改,并不需要再次编译 首先,看一段很熟悉的webpack配置 { test: [/\.jpg/], loader: require.resolve('url-loader'), options: { limit: 10000, name

随机推荐