時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
前言
本文是我對ASP.NET頁面載入速度提高的一些做法,這些做法分為以下部分:
1.采用 HTTP Module 控制頁面的生命周期。
2.自定義Response.Filter得到輸出流stream生成動態(tài)頁面的靜態(tài)內(nèi)容(磁盤緩存)。
3.頁面GZIP壓縮。
4.OutputCache 編程方式輸出頁面緩存。
5.刪除頁面空白字符串。(類似Google)
6.完全刪除ViewState。
7.刪除服務(wù)器控件生成的垃圾NamingContainer。
8.使用計劃任務(wù)按時生成頁面。(本文不包含該做法的實現(xiàn))
9.JS,CSS壓縮、合并、緩存,圖片緩存。(限于文章篇幅,本文不包含該做法的實現(xiàn))
10.緩存破壞。(不包含第9做法的實現(xiàn))
針對上述做法,我們首先需要一個 HTTP 模塊,它是整個頁面流程的入口和核心。
一、自定義Response.Filter得到輸出流stream生成動態(tài)頁面的靜態(tài)內(nèi)容(磁盤緩存)
如下的代碼我們可以看出,我們以 request.RawUrl 為緩存基礎(chǔ),因為它可以包含任意的QueryString變量,然后我們用MD5加密RawUrl 得到服務(wù)器本地文件名的變量,再實例化一個FileInfo操作該文件,如果文件最后一次生成時間小于7天,我們就使用.Net2.0新增的TransmitFile方法將存儲文件的靜態(tài)內(nèi)容發(fā)送到瀏覽器。如果文件不存在,我們就操作 response.Filter 得到的 Stream 傳遞給 CommonFilter 類,并利用FileStream寫入動態(tài)頁面的內(nèi)容到靜態(tài)文件中。
view sourceprint?001 namespace ASPNET_CL.Code.HttpModules
002 {
003???? public class CommonModule : IHttpModule
004???? {
005?? public void Init(HttpApplication application)
006?? {
007 application.BeginRequest += Application_BeginRequest;
008?? }
009?? private void Application_BeginRequest(object sender, EventArgs e)
010?? {
011 var context= HttpContext.Current;
012 var request = context.Request;
013 var url = request.RawUrl;
014 var response = context.Response;
015 var path = GetPath(url);
016 var file = new FileInfo(path);
017 if (DateTime.Now.Subtract(file.LastWriteTime).TotalDays < 7)
018 {
019???? response.TransmitFile(path);
020???? response.End();
021???? return;
022 }
023 try
024 {
025???? var stream = file.OpenWrite();
026???? response.Filter= new CommonFilter(response.Filter, stream);
027 }
028 catch (Exception)
029 {
030???? Log.Insert("");
031 }
032?? }
033?? public void Dispose() { }
034?? private static string GetPath(string url)
035?? {
036 var hash = Hash(url);
037 string fold = HttpContext.Current.Server.MapPath("~/Temp/");
038 return string.Concat(fold, hash);
039?? }
040?? private static string Hash(string url)
041?? {
042 url = url.ToUpperInvariant();
043 var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
044 var bs = md5.ComputeHash(Encoding.ASCII.GetBytes(url));
045 var s = new StringBuilder();
046 foreach (var b in bs)
047 {
048???? s.Append(b.ToString("x2").ToLower());
049 }
050 return s.ToString();
051?? }
052???? }
053 }
#p#副標題#e#
二、頁面GZIP壓縮
對頁面GZIP壓縮幾乎是每篇講解高性能WEB程序的幾大做法之一,因為使用GZIP壓縮可以降低服務(wù)器發(fā)送的字節(jié)數(shù),能讓客戶感覺到網(wǎng)頁的速度更快也減少了對帶寬的使用情況。當然,這里也存在客戶端的瀏覽器是否支持它。因此,我們要做的是,如果客戶端支持GZIP,我們就發(fā)送GZIP壓縮過的內(nèi)容,如果不支持,我們直接發(fā)送靜態(tài)文件的內(nèi)容。幸運的是,現(xiàn)代瀏覽器IE6.7.8.0,火狐等都支持GZIP。
為了實現(xiàn)這個功能,我們需要改寫上面的 Application_BeginRequest 事件:
? private void Application_BeginRequest(object sender, EventArgs e)
055?? {
056 var context = HttpContext.Current;
057 var request = context.Request;
058 var url = request.RawUrl;
059 var response = context.Response;
060 var path = GetPath(url);
061?????&n
關(guān)鍵詞標簽:ASP.NET
相關(guān)閱讀
熱門文章 誅仙3飛升任務(wù)怎么做-誅仙3飛升任務(wù)流程最新2022 鐘離圣遺物推薦-原神鐘離圣遺物詞條 解決方法:應(yīng)用程序“DEFAULT WEB SITE”中的服務(wù)器錯誤 使用aspnet_regiis.exe 重新注冊.NET Framework
人氣排行 誅仙3飛升任務(wù)怎么做-誅仙3飛升任務(wù)流程最新2022 asp.net表單提交方法GET\POST 在ASP.NET中如何判斷用戶IE瀏覽器的版本 Asp.net中messagebox的實現(xiàn)方法 Asp.net中的web.config配置 在ASP.NET MVC中實現(xiàn)大文件異步上傳 asp.net獲取URL和IP地址 FileUpload上傳多文件出現(xiàn)錯誤的解決方法