国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Asp.net網(wǎng)站優(yōu)化【轉(zhuǎn)】

2019-11-17 01:27:21
字體:
供稿:網(wǎng)友

asp.net網(wǎng)站優(yōu)化【轉(zhuǎn)】

閱讀目錄

  • 開始
  • 配置OutputCache
  • 啟用內(nèi)容過期
  • 解決資源文件升級(jí)問題
  • 啟用壓縮
  • 刪除無用的HttpModule
  • 其它優(yōu)化選項(xiàng)

本文將介紹一些方法用于優(yōu)化ASP.NET網(wǎng)站性能,這些方法都是不需要修改程序代碼的。 它們主要分為二個(gè)方面: 1. 利用ASP.NET自身的擴(kuò)展性進(jìn)行優(yōu)化。 2. 優(yōu)化IIS設(shè)置。

回到頂部

配置OutputCache

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

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

在網(wǎng)站的優(yōu)化階段,我們可以用Fiddler之類的工具找出一些內(nèi)容幾乎不會(huì)改變的頁(yè)面,給它們?cè)O(shè)置OutputCache, 但是,按照傳統(tǒng)的開發(fā)流程,我們需要針對(duì)每個(gè)頁(yè)面文件執(zhí)行以下操作: 1. 簽出頁(yè)面文件。 2. 添加OutputCache指令。 3. 重新發(fā)布頁(yè)面。 4. 簽入文件(如果遇到多分支并行,還可能需要合并操作)。 以上這些源代碼管理制度會(huì)讓一個(gè)簡(jiǎn)單的事情復(fù)雜化,那么,有沒一種更簡(jiǎn)單的方法能解決這個(gè)問題呢?

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

<?xml version="1.0" encoding="utf-8"?><OutputCache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                         xmlns:xsd="http://www.w3.org/2001/XMLSchema">    <Settings>        <Setting Duration="3" FilePath="/Pages/a3.aspx"  />        <Setting Duration="10" FilePath="/Pages/a5.aspx"  />    </Settings></OutputCache>

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

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

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

<system.webServer>    <modules>        <add name="SetOutputCacheModule" type="WebSiteOptimize.SetOutputCacheModule, WebSiteOptimize" />    </modules></system.webServer>

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

public class SetOutputCacheModule : IHttpModule{    static SetOutputCacheModule()    {        // 加載配置文件        string xmlFilePath = Path.Combine(HttpRuntime.AppDomainAppPath, "OutputCache.config");        ConfigManager.LoadConfig(xmlFilePath);    }    public void Init(Httpapplication app)    {        app.PreRequestHandlerExecute += new EventHandler(app_PreRequestHandlerExecute);    }    void app_PreRequestHandlerExecute(object sender, EventArgs e)    {        HttpApplication app = (HttpApplication)sender;        Dictionary<string, OutputCacheSetting> settings = ConfigManager.Settings;        if( settings == null )            throw new ConfigurationErrorsException("SetOutputCacheModule加載配置文件失敗。");        // 實(shí)現(xiàn)方法:        // 查找配置參數(shù),如果找到匹配的請(qǐng)求,就設(shè)置OutputCache        OutputCacheSetting setting = null;        if( settings.TryGetValue(app.Request.FilePath, out setting) ) {            setting.SetResponseCache(app.Context);        }    }

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

internal static class ConfigManager{    private static readonly string CacheKey = Guid.NewGuid().ToString();    private static Exception s_loadConfigException;    private static Dictionary<string, OutputCacheSetting> s_settings;    public static Dictionary<string, OutputCacheSetting> Settings    {        get{            Exception exceptin = s_loadConfigException;            if( exceptin != null )                throw exceptin;            return s_settings;        }    }    public static void LoadConfig(string xmlFilePath)    {        Dictionary<string, OutputCacheSetting> dict = null;        try {            OutputCacheConfig config = XmlHelper.XmlDeserializeFromFile<OutputCacheConfig>(xmlFilePath, Encoding.UTF8);            dict = config.Settings.ToDictionary(x => x.FilePath, StringComparer.OrdinalIgnoreCase);        }        catch( Exception ex ) {            s_loadConfigException = new System.Configuration.ConfigurationException(                "初始化SetOutputCacheModule時(shí)發(fā)生異常,請(qǐng)檢查" + xmlFilePath + "文件是否配置正確。", ex);        }        if( dict != null ) {            // 注冊(cè)緩存移除通知,以便在用戶修改了配置文件后自動(dòng)重新加載。            // 參考:細(xì)說 ASP.NET Cache 及其高級(jí)用法            //          http://www.survivalescaperooms.com/fish-li/archive/2011/12/27/2304063.html            CacheDependency dep = new CacheDependency(xmlFilePath);            HttpRuntime.Cache.Insert(CacheKey, xmlFilePath, dep,                Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, CacheRemovedCallback);        }        s_settings = dict;    }    private static void CacheRemovedCallback(string key, object value, CacheItemRemovedReason reason)    {        string xmlFilePath = (string)value;        // 由于事件發(fā)生時(shí),文件可能還沒有完全關(guān)閉,所以只好讓程序稍等。        System.Threading.Thread.Sleep(3000);        // 重新加載配置文件        LoadConfig(xmlFilePath);    }}

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

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

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

回到頂部

啟用內(nèi)容過期

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

有沒有想過可以把它們?cè)跒g覽器中長(zhǎng)久緩存起來呢?

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

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

然而,在IIS7中,這個(gè)參數(shù)不容易被發(fā)現(xiàn),需要以下操作才能找到: 選擇網(wǎng)站(或者網(wǎng)站子目錄)節(jié)點(diǎn),雙擊【HTTP響應(yīng)標(biāo)頭】

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

此時(shí)將會(huì)顯示:

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

注意:如果您在IIS7中針對(duì)某個(gè)子目錄或者文件設(shè)置【啟用內(nèi)容過期】,前面的對(duì)話框看起來是一模一樣的, 然而,在IIS6中,我們可以清楚地從對(duì)話框的標(biāo)題欄中知道我們?cè)谧鍪裁矗?

有時(shí)真感覺IIS7的界面在退步!

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

說到這里可能有人會(huì)想:這個(gè)過期時(shí)間我該設(shè)置多久呢? 十分鐘,2個(gè)小時(shí),一天,還是一個(gè)月? 在我看來,這個(gè)時(shí)間越久越好。 可能有人又會(huì)說了:萬(wàn)一我要升級(jí)某個(gè)JS文件怎么辦,時(shí)間設(shè)置久了,用戶怎么更新呢? 如果你問我這個(gè)問題,我也只能說是你的代碼不合理(畢竟你解決不了升級(jí)問題),想知道原因的話,請(qǐng)繼續(xù)閱讀。

回到頂部

解決資源文件升級(jí)問題

對(duì)于一些規(guī)模不大的網(wǎng)站來說,通常會(huì)將資源文件與程序文件一起部署到一個(gè)網(wǎng)站中。 這時(shí)可能會(huì)采用下面的方式來引用JS或者CSS文件:

<link type="text/css" href="aaaa.css" rel="Stylesheet" /><script type="text/javascript" src="bbb.js"></script>

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

對(duì)于前面談到的BUG,我認(rèn)為根源在于引用JS,CSS文件的方式有缺陷, 那種方法完全沒有考慮到版本升級(jí)問題, 正確的方法有二種: 1. 給文件名添加版本號(hào),像jquery那樣,每個(gè)版本一個(gè)文件(jquery-1.4.4.min.js)。 2. 在URL后面添加一個(gè)版本號(hào),讓原先的URL失效。

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

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

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

在頁(yè)面運(yùn)行時(shí),會(huì)產(chǎn)生如下的輸出結(jié)果:

<link type="text/css" rel="Stylesheet" href="/css/StyleSheet.css?_t=634642185820000000" /><script type="text/Javascript" src="/js/MyPage/fish.js?_t=634642154020000000"></script>

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

private static readonly string s_root = HttpRuntime.AppDomainAppPath.TrimEnd('//');public static string RefJsFileHtml(string path){    string filePath = s_root + path.Replace("/", "http://");    string version = File.GetLastWriteTimeUtc(filePath).Ticks.ToString();    return string.Format("<script type=/"text/javascript/" src=/"{0}?_t={1}/"></script>/r/n", path, version);}public static string RefCssFileHtml(string path){    string filePath = s_root + path.Replace("/", "http://");    string version = File.GetLastWriteTimeUtc(filePath).Ticks.ToString();    return string.Format("<link type=/"text/css/" rel=/"Stylesheet/" href=/"{0}?_t={1}/" />/r/n", path, version);}

上面這種獲取文件版本號(hào)的方法,是一種比較簡(jiǎn)單的解決方案。 每個(gè)引用的地方在生成HTML代碼時(shí),都會(huì)訪問文件的最后修改時(shí)間,這會(huì)給磁盤帶來一點(diǎn)讀的開銷

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 铁力市| 双峰县| 凉山| 长葛市| 普格县| 额尔古纳市| 龙山县| 二手房| 手游| 贵定县| 武穴市| 开平市| 巴楚县| 周口市| 洪泽县| 二连浩特市| 清远市| 渭源县| 改则县| 金堂县| 商水县| 平顶山市| 固原市| 巴楚县| 尖扎县| 普定县| 桐庐县| 长顺县| 阳朔县| 罗定市| 宜川县| 梁河县| 绥中县| 涿鹿县| 宝兴县| 新余市| 奇台县| 阿坝县| 景泰县| 嘉禾县| 平潭县|