詳解ASP.NET Core 中間件之壓縮、緩存
前言
今天給大家介紹一下在 ASP.NET Core 日常開發(fā)中用的比較多的兩個(gè)中間件,它們都是出自于微軟的 ASP.NET 團(tuán)隊(duì),他們分別是Microsoft.AspNetCore.ResponseCompression 和 Microsoft.AspNetCore.ResponseCaching , 下面讓我們一起看看的功能以及如何去使用吧。
Getting Started
Microsoft.AspNetCore.ResponseCompression
Microsoft.AspNetCore.ResponseCompression 這個(gè)中間件是 .NET Core 1.1 版本中新增加的,看名字應(yīng)該知道,它主要是負(fù)責(zé)對輸出的內(nèi)容進(jìn)行壓縮, 那么在我們WEB開發(fā)中主要就是 GZip 壓縮了。
Gzip 壓縮是我們在 WEB 中經(jīng)常會使用的一項(xiàng)性能優(yōu)化技術(shù),它可以對頁面輸出的內(nèi)容使用壓縮算法(GZip)進(jìn)行體積的壓縮, 那在以前的時(shí)候,我們可以使用 IIS 來做這項(xiàng)工作,但是現(xiàn)在我們的程序脫離 IIS了,就必須有一個(gè)中間件來幫我們做這件事情了,它就是我們要介紹的這個(gè)中間件。
1、添加 Microsoft.AspNetCore.ResponseCompression 包
你可以使用 Visual Studio 打開 NuGet 包管理器控制臺輸入一下命令安裝
Install-Package Microsoft.AspNetCore.ResponseCompression
也可以使用 NuGet包管理器UI界面安裝。
添加完成之后,你就可以在 project.json 中看到你添加的包了。注意目前版本是 1.0.0.

2、更新 Startup.cs 文件
修改 Startup , 在ConfigureServices 和Configure 兩個(gè)方法中添加如下代碼:
public class Startup
{
...
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
...
}
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
app.UseResponseCompression();
...
}
}
現(xiàn)在你就可以測試一下輸入的 Http Response 是否被壓縮了。
前:

后:

通過 前 后 對比,可以看出來,在 Response Headers 里面多了一個(gè) Content-Encoding:gzip 的頭部信息,說明我們的中間件生效了。
Microsoft.AspNetCore.ResponseCaching
Microsoft.AspNetCore.ResponseCaching 這個(gè)中間件也是 .NET Core 1.1 版本中新增加的,同樣看名字應(yīng)該知道,它主要是負(fù)責(zé)對輸出的內(nèi)容進(jìn)行緩存設(shè)置。在以前我們可以同樣在 IIS 中設(shè)置這些東西,但是粒度可能并沒有這么細(xì)。
我之前寫過一篇關(guān)于 ASP.NET Core 緩存的文章,里面介紹了 ASP.NET Core MVC 中的 Response 緩存,它是通過一個(gè) ResponseCacheAttribute 來實(shí)現(xiàn)的設(shè)置緩存頭信息:
[ResponseCache(VaryByHeader ="Accept-Encoding", Location = ResponseCacheLocation.Any, Duration = 10)]
public IActionResult About()
{
}
那,除了 MVC 提供的 ResponseCacheAttribute 外,還有另外一種方式設(shè)置緩存頭信息,如下:
public IActionResult About()
{
Response.GetTypedHeaders().CacheControl = new CacheControlHeaderValue()
{
Public = true,
MaxAge = TimeSpan.FromSeconds(10)
};
Response.Headers[HeaderNames.Vary] = new string[] { "Accept-Encoding" };
}
這兩種方式,最終的效果是一致的。
有了這些頭信息之后,我們就可以在服務(wù)端里面這個(gè)中間件干些什么事情了。所以,該中間件將會在適當(dāng)?shù)臅r(shí)候讀取這些頭信息,然后緩存到本地緩存里面,當(dāng)再有請求進(jìn)來的時(shí)候會直接跳過action,讀取緩存信息進(jìn)行返回。
下面,我們一起來看看怎么樣添加到我們的項(xiàng)目中吧,很簡單。
1、添加 Microsoft.AspNetCore.ResponseCaching 包
你可以使用 Visual Studio 打開 NuGet 包管理器控制臺輸入一下命令安裝
Install-Package Microsoft.AspNetCore.ResponseCaching
2、更新 Startup.cs 文件
修改 Startup , 在ConfigureServices 和Configure 兩個(gè)方法中添加如下代碼:
public class Startup
{
...
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCaching();
...
}
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
app.UseResponseCaching();
...
}
}
輸入的頭信息如下:

詳細(xì)示例可以看這里.
注意:上面的示例在 Chrome 瀏覽器中,當(dāng)你按 F5 或者右鍵刷新頁面時(shí)候, Http Response Header 中的 Control-Cache: max-age 有時(shí)候可能會不生效,這是因?yàn)?Chrome 瀏覽器有很智能的算法來猜測你當(dāng)前的行為是真的想刷新還是取緩存。 所以你可以試著把你的地址放入到一個(gè)HTML的Link中或者新開一個(gè)選項(xiàng)卡鍵入地址嘗試。而Edge和IE瀏覽器行為是符合預(yù)期的。
總結(jié)
以上是這兩個(gè)中間件的功能及使用方法,很簡單,就不多說了,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
透過ashx看瀏覽器服務(wù)器運(yùn)行本質(zhì)(圖解)
一般處理程序(HttpHandler):是一個(gè)實(shí)現(xiàn)System.Web.IHttpHandler接口的特殊類。任何一個(gè)實(shí)現(xiàn)了IHttpHandler接口的類是作為一個(gè)外部請求的目標(biāo)程序的前提,感興趣的朋友可以了解下或許有所幫助2013-01-01
ASP.NET MVC @Helper輔助方法和@functons自定義函數(shù)的使用方法
本文主要介紹ASP.NET MVC中使用@Helper和@functons自定義一些代碼片段,方便視圖調(diào)用,從而達(dá)到減少重復(fù)代碼,快速開發(fā)的目的,希望對大家有所幫助。2016-04-04
Entity?Framework使用Fluent?API配置案例
本文詳細(xì)講解了Entity?Framework使用Fluent?API配置案例的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
利用VS2019創(chuàng)建Web項(xiàng)目并發(fā)送到IIS及IIS與ASP.NET配置教程
這篇文章主要介紹了利用VS2019創(chuàng)建Web項(xiàng)目,并發(fā)送到IIS,以及IIS與ASP.NET配置,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
.NET性能優(yōu)化之為集合類型設(shè)置初始大小的方法
這篇文章主要介紹了.NET性能優(yōu)化之為集合類型設(shè)置初始大小的方法,今天要談的一個(gè)性能優(yōu)化的Tips是一個(gè)老生常談的點(diǎn),但是也是很多人沒有注意的一個(gè)點(diǎn)。在使用集合類型是,你應(yīng)該設(shè)置一個(gè)預(yù)估的初始大小,那么為什么需要這樣做?我們一起來從源碼的角度說一說2022-05-05
Asp.Net套用母版頁后元素ID不一致(個(gè)人總結(jié))
這篇文章主要介紹了Asp.Net套用母版頁后元素ID不一致(個(gè)人總結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
.Net通過TaskFactory.FromAsync簡化APM
這篇文章介紹了.Net通過TaskFactory.FromAsync簡化APM的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

