日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
不改代碼就能優(yōu)化ASP.NET網(wǎng)站性能的方法

本文將介紹一些方法用于優(yōu)化ASP.NET網(wǎng)站性能,這些方法都是不需要修改程序代碼的。

成都創(chuàng)新互聯(lián)公司長期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為古交企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站制作,古交網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

它們主要分為二個方面:

1. 利用ASP.NET自身的擴展性進(jìn)行優(yōu)化。

2. 優(yōu)化IIS設(shè)置。

配置OutputCache

用緩存來優(yōu)化網(wǎng)站性能的方法,估計是無人不知的。 ASP.NET提供了HttpRuntime.Cache對象來緩存數(shù)據(jù),也提供了OutputCache指令來緩存整個頁面輸出。雖然OutputCache指令使用起來更方便,也有非常好的效果,不過,它需要我們在那些頁面中添加這樣一個指令。

對于設(shè)置過OutputCache的頁面來說,瀏覽器在收到這類頁面的響應(yīng)后,會將頁面響應(yīng)內(nèi)容緩存起來。只要在指定的緩存時間之內(nèi),且用戶沒有強制刷新的操作,那么就根本不會再次請求服務(wù)端,而對于來自其它的瀏覽器發(fā)起的請求,如果緩存頁已生成,那么就可以直接從緩存中響應(yīng)請求,加快響應(yīng)速度。因此,OutputCache指令對于性能優(yōu)化來說,是很有意義的(除非所有頁面頁面都在頻繁更新)。

在網(wǎng)站的優(yōu)化階段,我們可以用Fiddler之類的工具找出一些內(nèi)容幾乎不會改變的頁面,給它們設(shè)置OutputCache,但是,按照傳統(tǒng)的開發(fā)流程,我們需要針對每個頁面文件執(zhí)行以下操作:

1. 簽出頁面文件。

2. 添加OutputCache指令。

3. 重新發(fā)布頁面。

4. 簽入文件(如果遇到多分支并行,還可能需要合并操作)。

以上這些源代碼管理制度會讓一個簡單的事情復(fù)雜化,那么,有沒一種更簡單的方法能解決這個問題呢?

接下來,本文將介紹一種方法,它利用ASP.NET自身的擴展性,以配置文件的方式為頁面設(shè)置OutputCache參數(shù)。配置文件其它就是一個XML文件,內(nèi)容如下:

 
 
 
 
  1.  
  2.                         xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  3.      
  4.          
  5.          
  6.      
  7.  

看了這段配置,我想您應(yīng)該也能猜到它能有什么作用。

每一行配置參數(shù)為一個頁面指定OutputCache所需要的參數(shù),示例文件為了簡單只使用二個參數(shù),其它可以支持的參數(shù)請參考OutputCache指令。

為了能讓這個配置文件有效,需要在web.config中配置以下內(nèi)容(適用于IIS7):

 
 
 
 
  1.  
  2.      
  3.          
  4.      
  5.  

在這里,我注冊了一個HttpModule,它的全部代碼如下:

 
 
 
 
  1. public class SetOutputCacheModule : IHttpModule  
  2. {  
  3.     static SetOutputCacheModule()  
  4.     {  
  5.         // 加載配置文件  
  6.         string xmlFilePath = Path.Combine(HttpRuntime.AppDomainAppPath, "OutputCache.config");  
  7.         ConfigManager.LoadConfig(xmlFilePath);  
  8.     }  
  9.  
  10.     public void Init(HttpApplication app)  
  11.     {  
  12.         app.PreRequestHandlerExecute += new EventHandler(app_PreRequestHandlerExecute);  
  13.     }  
  14.  
  15.     void app_PreRequestHandlerExecute(object sender, EventArgs e)  
  16.     {  
  17.         HttpApplication app = (HttpApplication)sender;  
  18.  
  19.         Dictionary settings = ConfigManager.Settings;  
  20.         if( settings == null )  
  21.             throw new ConfigurationErrorsException("SetOutputCacheModule加載配置文件失敗。");  
  22.  
  23.         // 實現(xiàn)方法:  
  24.         // 查找配置參數(shù),如果找到匹配的請求,就設(shè)置OutputCache  
  25.         OutputCacheSetting setting = null;  
  26.         if( settings.TryGetValue(app.Request.FilePath, out setting) ) {  
  27.             setting.SetResponseCache(app.Context);  
  28.         }  
  29.     }  

ConfigManager類用于讀取配置文件,并啟用了文件依賴技術(shù),當(dāng)配置文件更新后,程序會自動重新加載:

 
 
 
 
  1. internal static class ConfigManager  
  2. {  
  3.     private static readonly string CacheKey = Guid.NewGuid().ToString();  
  4.     private static Exception s_loadConfigException;  
  5.     private static Dictionary s_settings;  
  6.  
  7.     public static Dictionary Settings  
  8.     {  
  9.         get{  
  10.             Exception exceptin = s_loadConfigException;  
  11.             if( exceptin != null )  
  12.                 throw exceptin;  
  13.  
  14.             return s_settings;  
  15.         }  
  16.     }  
  17.  
  18.     public static void LoadConfig(string xmlFilePath)  
  19.     {  
  20.         Dictionary dict = null;  
  21.  
  22.         try {  
  23.             OutputCacheConfig config = XmlHelper.XmlDeserializeFromFile(xmlFilePath, Encoding.UTF8);  
  24.             dict = config.Settings.ToDictionary(x => x.FilePath, StringComparer.OrdinalIgnoreCase);  
  25.         }  
  26.         catch( Exception ex ) {  
  27.             s_loadConfigException = new System.Configuration.ConfigurationException(  
  28.                 "初始化SetOutputCacheModule時發(fā)生異常,請檢查" + xmlFilePath + "文件是否配置正確。", ex);  
  29.         }  
  30.  
  31.  
  32.         if( dict != null ) {  
  33.             // 注冊緩存移除通知,以便在用戶修改了配置文件后自動重新加載。  
  34.  
  35.             // 參考:細(xì)說 ASP.NET Cache 及其高級用法  
  36.             //          http://www.cnblogs.com/fish-li/archive/2011/12/27/2304063.html  
  37.             CacheDependency dep = new CacheDependency(xmlFilePath);  
  38.             HttpRuntime.Cache.Insert(CacheKey, xmlFilePath, dep,  
  39.                 Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, CacheRemovedCallback);  
  40.         }  
  41.  
  42.         s_settings = dict;  
  43.     }  
  44.  
  45.     private static void CacheRemovedCallback(string key, object value, CacheItemRemovedReason reason)  
  46.     {  
  47.         string xmlFilePath = (string)value;  
  48.  
  49.         // 由于事件發(fā)生時,文件可能還沒有完全關(guān)閉,所以只好讓程序稍等。  
  50.         System.Threading.Thread.Sleep(3000);  
  51.  
  52.         // 重新加載配置文件  
  53.         LoadConfig(xmlFilePath);  
  54.     }  
  55. }  

有了AutoSetOutputCacheModule,我們就可以直接使用配置文件為頁面設(shè)置OutputCache參數(shù),而不需要修改任何頁面,是不是很容易使用?

說明:MyMVC框架已支持這種功能,所有相關(guān)的可以從MyMVC框架的源碼中獲取。

建議:對于一些很少改變的頁面,緩存頁是一種很有效的優(yōu)化方法。

啟用內(nèi)容過期

每個網(wǎng)站都會有一些資源文件(圖片,JS,CSS),這些文件相對于ASPX頁面來說,它們的輸出內(nèi)容極有可能在一段長時間之內(nèi)不會有變化,而IIS在響應(yīng)這類資源文件時不會生成Cache-Control響應(yīng)頭。在這種情況下,瀏覽器或許會緩存它們,也許會再次發(fā)起請求(比如重啟后),總之就是緩存行為不受控制且緩存時間不夠長久。

有沒有想過可以把它們在瀏覽器中長久緩存起來呢?

為了告訴瀏覽器將這些文件長久緩存起來,減少一些無意義的請求(提高頁面呈現(xiàn)速度),我們可以在IIS中啟用內(nèi)容過期,這樣設(shè)置后,IIS就能生成Cache-Control響應(yīng)頭,明確告訴瀏覽器將文件緩存多久。

在IIS6中,這個參數(shù)很好找到:

然而,在IIS7中,這個參數(shù)不容易被發(fā)現(xiàn),需要以下操作才能找到:

選擇網(wǎng)站(或者網(wǎng)站子目錄)節(jié)點,雙擊【HTTP響應(yīng)標(biāo)頭】

再點擊右邊的【設(shè)置常用標(biāo)頭】鏈接

此時將會顯示:

說明:【啟用內(nèi)容過期】這個設(shè)置可以基于整個網(wǎng)站,也可以針對子目錄,或者一個具體的文件。

注意:如果您在IIS7中針對某個子目錄或者文件設(shè)置【啟用內(nèi)容過期】,前面的對話框看起來是一模一樣的,

然而,在IIS6中,我們可以清楚地從對話框的標(biāo)題欄中知道我們在做什么:

有時真感覺IIS7的界面在退步!

最后我想說一句:可以直接為整個網(wǎng)站啟用內(nèi)容過期,ASPX頁面是不會被緩存的!

說到這里可能有人會想:這個過期時間我該設(shè)置多久呢?

十分鐘,2個小時,一天,還是一個月?

在我看來,這個時間越久越好。

可能有人又會說了:萬一我要升級某個JS文件怎么辦,時間設(shè)置久了,用戶怎么更新呢?

如果你問我這個問題,我也只能說是你的代碼不合理(畢竟你解決不了升級問題),想知道原因的話,請繼續(xù)閱讀。

解決資源文件升級問題

對于一些規(guī)模不大的網(wǎng)站來說,通常會將資源文件與程序文件一起部署到一個網(wǎng)站中。

這時可能會采用下面的方式來引用JS或者CSS文件:

 
 
 
 
  1.  
  2.  

在這種情況下,如果使用了前面所說的【啟用內(nèi)容過期】方法,那么當(dāng)有JS,CSS文件需要升級時,由于瀏覽器的緩存還沒有過期,所以就不會請求服務(wù)器,此時會使用已緩存的版本,因此可能會出現(xiàn)各種奇怪的BUG

對于前面談到的BUG,我認(rèn)為根源在于引用JS,CSS文件的方式有缺陷,那種方法完全沒有考慮到版本升級問題,正確的方法有二種:

1. 給文件名添加版本號,像jquery那樣,每個版本一個文件(jquery-1.4.4.min.js)。

2. 在URL后面添加一個版本號,讓原先的URL失效。

第一種方法由于每次升級都產(chǎn)生了一個新文件,所以不存在緩存問題,但是,維護(hù)一大堆文件的成本可能會比較大,因此我建議采用第二種方法來解決。

在MyMVC的示例代碼中,我使用了下面的方法來引用這些資源文件:

 
 
 
 
  1. <%= HtmlExtension.RefCssFileHtml("/css/StyleSheet.css")%>  
  2. <%= HtmlExtension.RefJsFileHtml("/js/MyPage/fish.js")%>  

在頁面運行時,會產(chǎn)生如下的輸出結(jié)果:

 
 
 
 
  1.  
  2.  

這二個工具方法的實現(xiàn)代碼如下(在MyMVC的示例代碼中):

 
 
 
 
  1. private static readonly string s_root = HttpRuntime.AppDomainAppPath.TrimEnd('\\');  
  2.  
  3. public static string RefJsFileHtml(string path)  
  4. {  
  5.     string filePath = s_root + path.Replace("/", "\\");  
  6.     string version = File.GetLastWriteTimeUtc(filePath).Ticks.ToString();  
  7.     return string.Format("\r\n", path, version);  
  8. }  
  9.  
  10. public static string RefCssFileHtml(string path)  
  11. {  
  12.     string filePath = s_root + path.Replace("/", "\\");  
  13.     string version = File.GetLastWriteTimeUtc(filePath).Ticks.ToString();  
  14.     return string.Format("\r\n", path, version);  

上面這種獲取文件版本號的方法,是一種比較簡單的解決方案。每個引用的地方在生成HTML代碼時,都會訪問文件的最后修改時間,這會給磁盤帶來一點讀的開銷,如果您擔(dān)心這種實現(xiàn)方式可能會給性能帶來影響,那么也可以增加一個配置文件的方式來解決(請自行實現(xiàn)),例如以下結(jié)構(gòu):

 
 
 
 
  1.  
  2.                     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  3.      
  4.      
  5.  

如果您認(rèn)為這種配置文件需要手工維護(hù),不夠自動化,還可以采用程序的方式自動在運行時維護(hù)一個列表,總之,直接引用資源文件的方法是一種直接耦合,會給文件升級帶來麻煩,我們可以通過一個外部方法來解開這個直接耦合(給FileVersion增加一個屬性還還可以將內(nèi)部地址改成一個CDN地址)。

啟用壓縮

壓縮響應(yīng)結(jié)果也是常用的網(wǎng)站優(yōu)化方法,由于現(xiàn)在的瀏覽器都已支持壓縮功能,因此,如果在服務(wù)端能壓縮響應(yīng)結(jié)果,對于網(wǎng)速較慢的用戶來說,會減少很多網(wǎng)絡(luò)傳輸時間,最終的體驗就是網(wǎng)頁顯示速度變快了!

IIS6雖然提供壓縮的設(shè)置界面,然而配置是基于服務(wù)器級別的:

注意:這里的【應(yīng)用程序文件】不包括aspx,如果需要壓縮aspx的響應(yīng),需要手工修改x:\WINDOWS\system32\inetsrv\MetaBase.xml文件(參考加大字號部分):

 
 
 
 
  1.         HcCompressionDll="%windir%\system32\inetsrv\gzip.dll" 
  2.         HcCreateFlags="1" 
  3.         HcDoDynamicCompression="TRUE" 
  4.         HcDoOnDemandCompression="TRUE" 
  5.         HcDoStaticCompression="TRUE" 
  6.         HcDynamicCompressionLevel="9" 
  7.         HcFileExtensions="htm  
  8.             html  
  9.             txt  
  10.             js  
  11.             css  
  12.             htc"  
  13.         HcOnDemandCompLevel="10" 
  14.         HcPriority="1" 
  15.         HcScriptFileExtensions="asp  
  16.             exe  
  17.             aspx  
  18.             axd"  
  19.     >  

說明:要修改MetaBase.xml,需要停止IIS Admin Service服務(wù)。

在IIS7中,我們可以在服務(wù)器級別配置壓縮參數(shù):

然后在每個網(wǎng)站中開啟或者關(guān)閉壓縮功能:

說明:IIS7中已經(jīng)不再使用MetaBase.xml,所以我們找不到IIS6的那些設(shè)置了。 IIS7壓縮的過濾條件不再針對擴展名,而是采用了mimeType規(guī)則(保存在applicationHost.config)。根據(jù)IIS7的壓縮規(guī)則,當(dāng)我們啟用動態(tài)壓縮后,會壓縮aspx的響應(yīng)結(jié)果。

二種壓縮方法的差別:

1. 靜態(tài)內(nèi)容壓縮:當(dāng)服務(wù)器在第一次響應(yīng)某個靜態(tài)文件時,會生成一個壓縮后的結(jié)果,并保存到磁盤中,以便重用。

2. 動態(tài)內(nèi)容壓縮:【每次】在響應(yīng)客戶端之前,壓縮響應(yīng)結(jié)果,在內(nèi)存中完成,因此會給CPU帶來一些負(fù)擔(dān)。

注意:要不要【啟用動態(tài)內(nèi)容壓縮】這個參數(shù),需要評估服務(wù)器的CPU是否能以承受(觀察任務(wù)管理器或者查看性能計數(shù)器)。

刪除無用的HttpModule

對一個網(wǎng)站來說,ASP.NET提供的有些HttpMoudle可能并不是需要的,然而,如果你不去手工禁用它們,它們其實會一直運行。
比如 我 會禁用下面這些HttpMoudle:

 
 
 
 
  1.  
  2.      
  3.      
  4.      
  5.      
  6.      
  7.  

對于使用Forms身份認(rèn)證的網(wǎng)站的來說,下面這些HttpModule也是可以禁用的:

 
 
 
 
  1.  
  2.      
  3.      
  4.  

其它優(yōu)化選項

優(yōu)化ASP.NET網(wǎng)站是一個大的話題,除了博客中介紹的這些方法之外,還有以下方法也是可以參考的:

1. 升級服務(wù)器硬件配置。

2. 使用Windows Server 2008以上版本操作系統(tǒng)(網(wǎng)絡(luò)性能比2003要好)。

3. 優(yōu)化操作系統(tǒng)配置(例如禁用不需要的服務(wù))。

4. 禁用調(diào)試模式。

5. 網(wǎng)站使用專用應(yīng)用程序池。

原文鏈接:http://www.cnblogs.com/fish-li/archive/2012/12/23/2830301.html


本文標(biāo)題:不改代碼就能優(yōu)化ASP.NET網(wǎng)站性能的方法
標(biāo)題鏈接:http://www.5511xx.com/article/ccehjdd.html