2010-08-20 123 views
0

我正在構建一個應用程序,我嘗試了YSlow並獲得了大部分練習的F級。我有很多正在減少的jscript。我希望能夠緩存其中的一些內容,因爲頁面會被多次調用。緩存asp.net頁面

我有一個主時代,我想緩存腳本和css文件。

我該如何做到這一點? 有沒有推薦的最佳實踐? 我能做出其他性能改進嗎?

+0

YSlow建議你可以做不同的性能改進。至於緩存你的腳本,請確保它們被外部化爲單獨的文件,並且它們將被客戶端瀏覽器自動緩存。如果可能的話,儘量減少它們的數量,將它們分組爲更少的文件以減少網絡呼叫。 – 2010-08-20 11:56:39

+0

不知道你在這裏問什麼。 YSlow的建議是關於客戶端的。 ASP.NET緩存是關於服務器端的。實現ASP.NET緩存不會改變YSlow評級中的任何內容。 – 2010-08-20 11:57:25

+1

注意:如果您不在農場,請忽略YSlow關於電子標籤的評論。如果你在農場,建議採用更復雜的方法。關閉電子標籤的建議比沒有用的更糟糕,並且損害了性能。 – 2010-08-20 11:59:15

回答

4
  1. 有你今年重讀2616了嗎?如果沒有,那麼。嘗試構建不熟悉HTTP的網站就像是在醉酒時試圖誘惑某人;只是因爲很多其他人這樣做並不意味着你會有很好的表現。

  2. 如果某個資源可以在給定的時間段內安全地重新使用(例如安全等待下一個小時/日/月),請這麼說。使用緩存控制頭的max-age組件以及expires(max-age比expires更好,但兩者都不需要花費)。

  3. 如果您知道上次更改的時間,請在Last-Modified標題中說明(請參閱下面的註釋)。如果您不知道什麼時候上次更改了某些內容,但是可以添加知道的功能,則可以這樣做(例如,UPDATE上的時間戳數據庫行)。

  4. 如果您可以保存每次更改內容的記錄並從中創建電子標籤。雖然電子標籤不應該以時間爲基礎,但是如果你知道它們不能以更精細的分辨率進行更改,那麼例外就是例外(時間到最近的0.5秒是好的,如果每0.5秒不能超過1次) )

  5. 如果您收到帶有If-Modified-Since的匹配上次更改時間的日期或匹配電子標籤的If-None-Match的請求,請發送304而不是整個頁面。

  6. 使用Gzip或Deflate壓縮(當客戶說它可以處理這兩種壓縮時放氣略好,但請注意您必須更改電子標籤。爲此發送正確的Vary頭部會破壞IE緩存,因此改變User-Agent(不完美的世界的不完美解決方案)。如果在.NET中使用自己的壓縮方式,請注意刷新壓縮流會導致錯誤,請在Close()上最後一次刷新之前編寫一個僅在Flush()上刷新輸出的包裝器。

  7. 不要爲您完成高速緩存。關閉靜態文件上的電子標籤可以使您獲得更好的YSlow評級和更差的性能(當應使用由YSlow推薦的更復雜的解決方案時,除了在網站上)。忽略YSlow關於關閉電子標籤的說法(也許他們已經修復了這個錯誤,現在不再說了),除非你在一個Web服務器場中,不同的服務器類型可以處理相同的請求(例如IIS和Apache處理相同的URI;雅虎是這是爲什麼這爲他們工作,大多數人都沒有)。

  8. 公衆對私人的看法,除非不合格。

  9. 避免做任何依賴於會話的事情。如果你能關閉會議,那就更好了。

  10. 避免發送大量的視圖狀態。如果你可以做一些沒有視圖狀態的東西,那麼更好。

  11. 進入IIS並查看HTTP Headers部分。爲靜態文件設置適當的值。請注意,這可以在每個站點,每個目錄和每個文件的基礎上完成。

  12. 如果你有一個真正的海量文件(.js,.css),那麼給它一個版本號,並將該版本放入用於訪問它的URI(blah.js /?version = 1.1.2)。然後,您可以設置一個非常長的到期日期(1年)和/或硬編碼的電子標籤,而不必擔心緩存過期問題,因爲您將在下一次更改版本號,並將其更改爲網絡的其他部分,這是一種新的資源比更新的一個。

編輯:

我說: 「見下面的說明」 並沒有添加註釋。

任何資源的最後修改時間是最近的:

  1. 任何東西(腳本,代碼隱藏)用於創建發送的實體。

  2. 任何用作它的一部分。

  3. 任何被用作它的一部分,現在已被刪除。

其中,編號3可能是最棘手的工作,因爲它畢竟已被刪除。一種解決方案是跟蹤資源本身的變化,並在刪除用於創建資源的任何東西時進行更新,另一種方法是在物品仍然存在的情況下進行「軟刪除」,但標記爲已刪除且未用於任何其他方式。追蹤這些東西的最佳方式是,取決於應用程序。

+0

非常感謝。真正有用的輸入。 – Churchill 2010-08-20 14:25:38

1

您應該創建單獨的.js和.css文件,瀏覽器會爲您執行緩存。使用從js文件中刪除所有空白的js-minimizer也是一個好主意。

如果您有一個像> 100Kb的巨大ViewState,請儘量減少它。如果ViewState的仍然是巨大的,你可以ViewState的存儲服務器上的文件中...

http://aspalliance.com/472

您也可以使用緩存的頁面,如果該頁面是不是太動態...

http://msdn.microsoft.com/en-us/library/06bh14hk.aspx

1

您還可以將常見的js和css庫引用到可信的在線商店。例如,如果將jquery添加爲<script src="http://code.jquery.com/jquery-latest.js"></script>,那麼由於之前引用此地址的其他網站(即使它因爲您的網站而被緩存),jquery文件可能已被客戶端的瀏覽器緩存。 這種方式可能有利有弊,但有這樣一種方法。 另外我不知道YSlow的迴應是否會以這種方式發生變化。

+0

專家如你所描述的那樣,如果客戶最近沒有看到來自該域的任何內容,那麼con是額外的dns-lookup命中。如果使用來自同一個域的多個文件,Pro強大地勝過它。我不知道YSlow的迴應是否會改變,但是誰在乎 - 工具應該適合我們,而不是我們的工具。 – 2010-08-20 12:20:07