如何在Asp.Net Core开启压缩响应中间件,提高响应和加载速度

起因

突然发现博客在从Nancy切换到Asp.Net Core的时候,没有对静态资源进行压缩.其实在Asp.Net Core对静态文件进行压缩响应,是件很方便的事情,因为有现成的中间件,只需要简单配置开启就行了.

下面看一下如何开启响应压缩中间件:
using System.IO.Compression;
using Microsoft.AspNetCore.ResponseCompression;

namespace QiuFengBlog
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            //配置br压缩,以最快的方法完成压缩
            _ = builder.Services.Configure<BrotliCompressionProviderOptions>(options =>
            {
                options.Level = CompressionLevel.Fastest;
            });

            //配置gzip压缩,以最快的方法完成压缩
            _ = builder.Services.Configure<GzipCompressionProviderOptions>(options =>
            {
                options.Level = CompressionLevel.Fastest;
            });

            //1. 添加响应压缩中间件
            _ = builder.Services.AddResponseCompression(options =>
            {
                options.MimeTypes = ResponseCompressionDefaults.MimeTypes;  //使用默认的配置
                options.Providers.Add<BrotliCompressionProvider>();         //优先使用br方式压缩响应
                options.Providers.Add<GzipCompressionProvider>();           //使用gzip方式压缩响应
            });

            // Add services to the container.
            _ = builder.Services.AddControllersWithViews(options =>
            {
            }).AddNewtonsoftJson();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (!app.Environment.IsDevelopment())
            {
                _ = app.UseExceptionHandler("/Home/Error");
            }

            //2. 使用压缩响应中间件
            _ = app.UseResponseCompression();
            _ = app.UseStaticFiles();

            _ = app.UseRouting();

            _ = app.UseAuthorization();

            _ = app.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");

            app.Run();
        }
    }
}

关于默认配置对那些是进行压缩响应的,我们看一下ResponseCompressionDefaults配置:

public class ResponseCompressionDefaults
{
    /// <summary>
    /// Default MIME types to compress responses for.
    /// </summary>
    // This list is not intended to be exhaustive, it's a baseline for the 90% case.
    public static readonly IEnumerable<string> MimeTypes = new[]
    {
            // General
            "text/plain",
            // Static files
            "text/css",
            "application/javascript",
            "text/javascript",
            // MVC
            "text/html",
            "application/xml",
            "text/xml",
            "application/json",
            "text/json",
            // WebAssembly
            "application/wasm",
    };
}

若是感觉不满足我们的需要,可以按需要增加.甚至不使用ResponseCompressionDefaults,

//增加这些文件类型进行压缩响应
var newMimes = new string[]
{
    "application/pdf", //pdf
    "audio/mpeg",      //mp3
    "audio/x-mpegurl",  //m3u
    "image/gif"        //gif
};

//1. 添加响应压缩中间件
_ = builder.Services.AddResponseCompression(options =>
{
    options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(newMimes);  //增加新mime类型配置
    options.Providers.Add<BrotliCompressionProvider>();         //优先使用br方式压缩响应
    options.Providers.Add<GzipCompressionProvider>();           //使用gzip方式压缩响应
});

下面我们先看看未开启压缩请求大小:

未开启压缩响应中间件的请求大小为1.2Mb

开启压缩响应中间件后请求大小:

开启压缩响应中间件后的请求大小为467KB

开启压缩响应中间件后,博客请求大小减少了将近三分之二,请求完成时间也差不多是减少了三分之二.还是很有效果的.

秋风 2022-12-24