ASP.NET Core緩存靜態(tài)資源示例詳解
背景
緩存樣式表,JavaScript或圖像文件等靜態(tài)資源可以提高您網(wǎng)站的性能。在客戶端,總是從緩存中加載一個(gè)靜態(tài)文件,這樣可以減少對(duì)服務(wù)器的請(qǐng)求數(shù)量,從而減少獲取頁(yè)面及其資源的時(shí)間。在服務(wù)器端,由于它們的請(qǐng)求較少,服務(wù)器可以處理更多的客戶端而無(wú)需升級(jí)硬件。
雖然緩存是一件好事,但您必須確保客戶端始終運(yùn)行最新版本的應(yīng)用程序。當(dāng)您部署下一個(gè)版本的網(wǎng)站時(shí),您不希望客戶端使用過(guò)時(shí)的緩存版本的文件。
方案:
為確保用戶始終使用最新版本的文件,我們必須為每個(gè)文件版本提供一個(gè)唯一的URL。有很多策略:
- 使用查詢字符串: http://sample.com/file.js?v=123
- 重命名文件: http://sample.com/file.123.js
- 創(chuàng)建一個(gè)目錄: http://sample.com/123/file.js
ASP.NET Core提供了一種使用 TagHelper來(lái)追加版本與查詢字符串的機(jī)制。它支持以靜態(tài)資源為目標(biāo)的最常見(jiàn)的HTML標(biāo)簽:script,link和img。所有你需要做的是在對(duì)應(yīng)Html標(biāo)簽中追加asp-append-version="true"
:
<link rel="stylesheet" href="~/css/site.css" rel="external nofollow" asp-append-version="true" /> <script src="~/js/site.js" asp-append-version="true"></script> <img src="~/images/banner1.svg" asp-append-version="true" />
在瀏覽器中的展現(xiàn):
<link rel="stylesheet" href="/css/site.css?v=1wp5zz4e-mOPFx4X2O8seW_DmUtePn5xFJk1vB7JKRc" rel="external nofollow" /> <script src="/js/site.js?v=EWaMeWsJBYWmL2g_KkgXZQ5nPe-a3Ichp0LEgzXczKo"></script> <img src="/images/banner1.svg?v=GaE_EmkeBf-yBbrJ26lpkGd4jkOSh1eVKJaNOw9I4uk" />
每個(gè)文件都會(huì)有對(duì)應(yīng)的V值,并存儲(chǔ)在一個(gè)IMemoryCache
文件的URL現(xiàn)在是唯一的,并且會(huì)在文件更改時(shí)更改,所以我們可以將緩存頭添加到響應(yīng)中,以指示客戶端文件可以永久存儲(chǔ)在緩存中
實(shí)踐
為了指示瀏覽器將文件存儲(chǔ)在緩存中,我們必須發(fā)送Cache-control頭文件和Expires頭文件以實(shí)現(xiàn)HTTP/1.0兼容性。為了添加這些頭文件,我們使用了OnPrepareResponse回調(diào)函數(shù)StaticFilesOptions。我們來(lái)修改這個(gè)Startup.cs文件:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseStaticFiles(new StaticFileOptions { OnPrepareResponse = context => { //緩存一年 if (!string.IsNullOrEmpty(context.Context.Request.Query["v"])) { context.Context.Response.Headers.Add("cache-control", new[] { "public,max-age=31536000" }); context.Context.Response.Headers.Add("Expires", new[] { DateTime.UtcNow.AddYears(1).ToString("R") }); // Format RFC1123 } } }); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
可以查看開(kāi)發(fā)者控制臺(tái),發(fā)現(xiàn)靜態(tài)資源都被緩存:
如果不想緩存某個(gè)靜態(tài)文件,修改Startup.cs文件:
app.UseStaticFiles(new StaticFileOptions { OnPrepareResponse = context => { //緩存一年 //以下操作是UseStaticFiles內(nèi)部默認(rèn)實(shí)現(xiàn) if (!string.IsNullOrEmpty(context.Context.Request.Query["v"]))//資源添加asp-append-version="true"后v是查詢參數(shù) { //context.Context.Response.Headers.Add("cache-control", new[] { "public,max-age=31536000" }); context.Context.Response.Headers.Add("cache-control", new[] { "public,no-cache" }); context.Context.Response.Headers.Add("Expires", new[] { DateTime.UtcNow.AddYears(1).ToString("R") }); // Format RFC1123 } } });
會(huì)發(fā)現(xiàn)無(wú)論怎么刷新,site.js?v=7mkNbU1tgQL1bUeZe3j2R151hKLhLDKO4BBaR-iqCy0文件永遠(yuǎn)都是重新請(qǐng)求,并沒(méi)有使用緩存機(jī)制
結(jié)論
使用HTTP緩存對(duì)于性能方面的原因(客戶端和服務(wù)器端)非常重要。使用ASP.NET Core,您可以利用提供的功能TagHelpers來(lái)生成版本控制的URL,并更改默認(rèn)配置StaticFilesMiddleware為資源Urls添加header的Cache-control屬性 。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
asp.net(vb)實(shí)現(xiàn)金額轉(zhuǎn)換成大寫的函數(shù)
asp.net(vb)實(shí)現(xiàn)金額轉(zhuǎn)換成大寫的函數(shù)代碼,需要的朋友可以參考下。2011-10-10Asp.net Core 3.1基于AspectCore實(shí)現(xiàn)AOP實(shí)現(xiàn)事務(wù)、緩存攔截器功能
這篇文章主要介紹了Asp.net Core 3.1基于AspectCore實(shí)現(xiàn)AOP實(shí)現(xiàn)事務(wù)、緩存攔截器功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Razor TagHelper實(shí)現(xiàn)Markdown轉(zhuǎn)HTML的方法
下面小編就為大家分享一篇Razor TagHelper實(shí)現(xiàn)Markdown轉(zhuǎn)HTML的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12asp.net 關(guān)于==?:和if()else()條件判斷等效例子
關(guān)于==?:和if()else() 等效例子2010-03-03asp.net實(shí)現(xiàn)生成靜態(tài)頁(yè)并添加鏈接的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)生成靜態(tài)頁(yè)并添加鏈接的方法,非常實(shí)用的功能,需要的朋友可以參考下2014-07-07.NET5實(shí)現(xiàn)操作注冊(cè)表的方法
本文詳細(xì)講解了.NET5實(shí)現(xiàn)操作注冊(cè)表的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02.NET C#創(chuàng)建WebService服務(wù)簡(jiǎn)單實(shí)例
這篇文章主要為大家詳細(xì)介紹了.NET C# 創(chuàng)建WebService服務(wù)簡(jiǎn)單實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05ASP.NET MVC5網(wǎng)站開(kāi)發(fā)管理列表、回復(fù)及刪除(十三)
這篇文章主要介紹了ASP.NET MVC5網(wǎng)站開(kāi)發(fā)實(shí)現(xiàn)管理列表、回復(fù)及刪除,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-09-09如何傳值在2個(gè)頁(yè)面之間 要求不刷新父頁(yè)面,并且不能用Querystring傳值
通過(guò)Cookie,因?yàn)樗瓤梢栽诜?wù)器端對(duì)其進(jìn)行操作,也可在客戶端對(duì)其進(jìn)行操作但是缺點(diǎn)是不安全,而且有時(shí)客戶端會(huì)由于安全問(wèn)題禁用Cookie!2008-12-12