原文地址:Pre-compressed static files with ASP.NET Core
作者:Gunnar Peipman
譯者:Lamond Lu
譯文:https://www.cnblogs.com/lwqlun/p/10552131.html
示例程式碼:https://github.com/lamondlu/CompressedStaticFileSample
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 essay-headers = context.Context.Response.Headers;
string contentType = essay-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";
}
essay-headers.Add("Content-Encoding", "gzip");
essay-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 essay-headers = context.Context.Response.Headers;
var contentType = essay-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))
{
essay-headers.Add("Content-Encoding", "gzip");
essay-headers["Content-Type"] = mimeType;
}
}
});
至此,使用以上的程式碼,本文的主題就被解決了。
針對那些想直接使用現成庫的開發人員,可以使用Nuget直接下載Peter Andersson做好的中介軟體。
Install-Package CompressedStaticFiles -Version 1.0.4
總結
雖然使用預壓縮檔案不是Web開發的主流,但它仍然可以節省CPU和頻寬。 壓縮靜態檔案可以作為ASP.NET Core應用程式構建的一個步驟。 儘管ASP.NET Core開箱即不支援預壓縮檔案,但我們依然可以透過擴充套件靜態檔案中介軟體,使其支援預壓縮檔案。