ASP.NET Core緩存靜態(tài)資源示例詳解
背景
緩存樣式表,JavaScript或圖像文件等靜態(tài)資源可以提高您網(wǎng)站的性能。在客戶端,總是從緩存中加載一個靜態(tài)文件,這樣可以減少對服務(wù)器的請求數(shù)量,從而減少獲取頁面及其資源的時間。在服務(wù)器端,由于它們的請求較少,服務(wù)器可以處理更多的客戶端而無需升級硬件。
雖然緩存是一件好事,但您必須確??蛻舳耸冀K運行最新版本的應(yīng)用程序。當(dāng)您部署下一個版本的網(wǎng)站時,您不希望客戶端使用過時的緩存版本的文件。
方案:
為確保用戶始終使用最新版本的文件,我們必須為每個文件版本提供一個唯一的URL。有很多策略:
- 使用查詢字符串: http://sample.com/file.js?v=123
- 重命名文件: http://sample.com/file.123.js
- 創(chuàng)建一個目錄: http://sample.com/123/file.js
ASP.NET Core提供了一種使用 TagHelper來追加版本與查詢字符串的機制。它支持以靜態(tài)資源為目標(biāo)的最常見的HTML標(biāo)簽:script,link和img。所有你需要做的是在對應(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" />
每個文件都會有對應(yīng)的V值,并存儲在一個IMemoryCache
文件的URL現(xiàn)在是唯一的,并且會在文件更改時更改,所以我們可以將緩存頭添加到響應(yīng)中,以指示客戶端文件可以永久存儲在緩存中
實踐
為了指示瀏覽器將文件存儲在緩存中,我們必須發(fā)送Cache-control頭文件和Expires頭文件以實現(xiàn)HTTP/1.0兼容性。為了添加這些頭文件,我們使用了OnPrepareResponse回調(diào)函數(shù)StaticFilesOptions。我們來修改這個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?}");
});
}
可以查看開發(fā)者控制臺,發(fā)現(xiàn)靜態(tài)資源都被緩存:
如果不想緩存某個靜態(tài)文件,修改Startup.cs文件:
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = context =>
{
//緩存一年
//以下操作是UseStaticFiles內(nèi)部默認(rèn)實現(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
}
}
});
會發(fā)現(xiàn)無論怎么刷新,site.js?v=7mkNbU1tgQL1bUeZe3j2R151hKLhLDKO4BBaR-iqCy0文件永遠(yuǎn)都是重新請求,并沒有使用緩存機制

結(jié)論
使用HTTP緩存對于性能方面的原因(客戶端和服務(wù)器端)非常重要。使用ASP.NET Core,您可以利用提供的功能TagHelpers來生成版本控制的URL,并更改默認(rèn)配置StaticFilesMiddleware為資源Urls添加header的Cache-control屬性 。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
asp.net中Fine Uploader文件上傳組件使用介紹
最近在處理后臺數(shù)據(jù)時需要實現(xiàn)文件上傳.考慮到對瀏覽器適配上采用Fine Uploader. Fine Uploader 采用ajax方式實現(xiàn)對文件上傳.同時在瀏覽器中直接支持文件拖拽[對瀏覽器版本有要求類似IE版本必須是9或是更高的IE10].2013-01-01
使用DataTable.Select 方法時,特殊字符的轉(zhuǎn)義方法分享
常見的特殊字符 基本都能轉(zhuǎn)義 ,不知道還有沒有漏掉的 ,目前使用正常 ,有需要的朋友可以參考一下2013-10-10
使用HttpWebRequest向網(wǎng)站模擬上傳數(shù)據(jù)
使用HttpWebRequest向網(wǎng)站模擬上傳數(shù)據(jù)...2006-09-09
asp.net創(chuàng)建位圖生成驗證圖片類(驗證碼類)
本文提供一個asp.net生成驗證圖片的類,功能是顯示簡單的字符串,大家參考使用吧2014-01-01
Visual Studio 2017 針對移動開發(fā)的新特性匯總
Visual Studio是世界上最好的IDE之一,下面就讓我們一起來看看Visual Studio 2017中有哪些功能使得移動開發(fā)變得更加容易,感興趣的朋友通過本文學(xué)習(xí)下吧2017-05-05

