亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Asp.net網站優化【轉】

2019-11-17 01:27:21
字體:
來源:轉載
供稿:網友

asp.net網站優化【轉】

閱讀目錄

  • 開始
  • 配置OutputCache
  • 啟用內容過期
  • 解決資源文件升級問題
  • 啟用壓縮
  • 刪除無用的HttpModule
  • 其它優化選項

本文將介紹一些方法用于優化ASP.NET網站性能,這些方法都是不需要修改程序代碼的。 它們主要分為二個方面: 1. 利用ASP.NET自身的擴展性進行優化。 2. 優化IIS設置。

回到頂部

配置OutputCache

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

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

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

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

<?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>

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

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

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

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

在這里,我注冊了一個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加載配置文件失敗。");        // 實現方法:        // 查找配置參數,如果找到匹配的請求,就設置OutputCache        OutputCacheSetting setting = null;        if( settings.TryGetValue(app.Request.FilePath, out setting) ) {            setting.SetResponseCache(app.Context);        }    }

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

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時發生異常,請檢查" + xmlFilePath + "文件是否配置正確。", ex);        }        if( dict != null ) {            // 注冊緩存移除通知,以便在用戶修改了配置文件后自動重新加載。            // 參考:細說 ASP.NET Cache 及其高級用法            //          http://www.49028c.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;        // 由于事件發生時,文件可能還沒有完全關閉,所以只好讓程序稍等。        System.Threading.Thread.Sleep(3000);        // 重新加載配置文件        LoadConfig(xmlFilePath);    }}

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

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

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

回到頂部

啟用內容過期

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

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

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

在IIS6中,這個參數很好找到:

然而,在IIS7中,這個參數不容易被發現,需要以下操作才能找到: 選擇網站(或者網站子目錄)節點,雙擊【HTTP響應標頭】

再點擊右邊的【設置常用標頭】鏈接,

此時將會顯示:

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

注意:如果您在IIS7中針對某個子目錄或者文件設置【啟用內容過期】,前面的對話框看起來是一模一樣的, 然而,在IIS6中,我們可以清楚地從對話框的標題欄中知道我們在做什么:

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

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

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

回到頂部

解決資源文件升級問題

對于一些規模不大的網站來說,通常會將資源文件與程序文件一起部署到一個網站中。 這時可能會采用下面的方式來引用JS或者CSS文件:

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

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

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

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

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

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

在頁面運行時,會產生如下的輸出結果:

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

這二個工具方法的實現代碼如下(在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);}

上面這種獲取文件版本號的方法,是一種比較簡單的解決方案。 每個引用的地方在生成HTML代碼時,都會訪問文件的最后修改時間,這會給磁盤帶來一點讀的開銷

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲女人被黑人巨大进入| 欧美性xxxx极品hd满灌| 亚洲第一级黄色片| 国产一区二区日韩| 精品毛片网大全| 91在线观看欧美日韩| 欧美最近摘花xxxx摘花| 久久中文字幕国产| 成人美女av在线直播| 亚洲福利视频在线| 狠狠色狠狠色综合日日五| 久久精品这里热有精品| 成人a级免费视频| 国产精品av免费在线观看| 久久久亚洲影院你懂的| 在线视频免费一区二区| 国产精品成人免费视频| 亚洲影视中文字幕| 夜夜嗨av色综合久久久综合网| 在线看片第一页欧美| 欧美电影在线播放| 欧美一区二区三区免费视| 美女性感视频久久久| 亚洲天堂网站在线观看视频| 亚洲天堂av高清| 国产一区二区在线免费| 97碰碰碰免费色视频| 青青青国产精品一区二区| 成人a视频在线观看| 永久免费精品影视网站| 国产亚洲精品久久久久久牛牛| 精品福利在线观看| 欧美成人精品在线观看| 欧美日韩免费观看中文| 国产午夜精品免费一区二区三区| 亚洲国产另类久久精品| 日韩黄色高清视频| 色噜噜狠狠狠综合曰曰曰| 欧美电影免费观看网站| 国产精品色午夜在线观看| 国产精品中文久久久久久久| 亚洲精品久久久久久久久| 亚洲一级免费视频| 不卡中文字幕av| 国产精品亚洲网站| 91高清免费在线观看| 性欧美暴力猛交69hd| 伊人亚洲福利一区二区三区| 国产精品电影观看| 视频在线观看99| 欧美亚洲伦理www| 国产精品mp4| 精品欧美国产一区二区三区| 欧美人与性动交a欧美精品| 国模吧一区二区| 亚洲欧美日韩一区在线| 亚洲国产欧美自拍| 国产热re99久久6国产精品| 色播久久人人爽人人爽人人片视av| 亚洲日本成人网| 欧美日韩成人在线观看| 色琪琪综合男人的天堂aⅴ视频| 欧美理论电影在线播放| 欧美成aaa人片在线观看蜜臀| 91chinesevideo永久地址| 欧美激情精品久久久久久免费印度| 亚洲激情免费观看| 麻豆精品精华液| 久久电影一区二区| 色狠狠久久aa北条麻妃| 日韩毛片在线看| 色噜噜狠狠狠综合曰曰曰88av| 精品久久在线播放| 国产精品大片wwwwww| 欧美成年人视频| 国产日韩欧美日韩大片| 日韩欧美一区二区在线| 最近2019中文字幕mv免费看| 久久香蕉国产线看观看网| 欧美日韩国产精品一区二区三区四区| 国产在线观看91精品一区| 国产视频一区在线| 亚洲精品一区二区在线| 久久亚洲国产精品成人av秋霞| 大桥未久av一区二区三区| 欧美成人免费全部观看天天性色| 欧美激情视频一区二区三区不卡| 国产伦精品免费视频| 亚洲精品中文字| 韩国精品美女www爽爽爽视频| 亚洲精品一区二区三区不| 精品美女久久久久久免费| 欧亚精品在线观看| 国产精品极品在线| 亚洲人精选亚洲人成在线| 亚洲精品一区在线观看香蕉| 成人中心免费视频| 在线视频免费一区二区| 精品国产一区久久久| 97香蕉久久夜色精品国产| 国产91色在线免费| 日本一区二区不卡| 亚洲一区二区三区在线免费观看| 91国产视频在线播放| 成人在线播放av| 亚洲精品国产suv| 欧美一区二区视频97| 亚洲国产精品视频在线观看| 91精品国产高清自在线看超| 日韩av免费网站| 97免费视频在线| 亚洲乱亚洲乱妇无码| 亚洲国产日韩欧美在线动漫| 亚洲国产高清福利视频| 亚洲无av在线中文字幕| 国产成人精品电影久久久| 国产精品大片wwwwww| 欧美与欧洲交xxxx免费观看| 国产视频亚洲视频| 国产精品女主播视频| 久久视频在线直播| 欧美一区二区.| 中文字幕欧美日韩va免费视频| 久精品免费视频| 精品一区电影国产| 日韩一区在线视频| 精品亚洲一区二区三区四区五区| 欧美视频在线观看免费| 欧美综合国产精品久久丁香| 日韩精品在线免费观看| 欧美一级视频免费在线观看| 亚洲午夜女主播在线直播| 欧美精品18videos性欧美| 日韩精品一区二区三区第95| 欧美高清视频在线播放| 青青在线视频一区二区三区| 欧美日韩美女在线| 91欧美日韩一区| 亚洲九九九在线观看| 欧美乱大交做爰xxxⅹ性3| 91久久精品在线| 久久好看免费视频| 蜜月aⅴ免费一区二区三区| 亚洲国产精品系列| 日本一区二区三区在线播放| 国产精品一区电影| 国产91成人在在线播放| 九九热这里只有精品免费看| 国产精品自拍小视频| 欧美小视频在线| 亚洲国产精品久久久久久| 亚洲激情小视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品欧美激情| 欧美性猛交xxxx乱大交蜜桃| 在线播放日韩欧美| 亚洲剧情一区二区| 久久这里只有精品99| 欧美人与性动交| 日韩电影中文字幕在线| 国产精品99蜜臀久久不卡二区| 国产精品久久久久久久久久99| 精品久久久久久中文字幕大豆网| 亚洲性视频网站|