2014-10-10 64 views
0

我正在嘗試改進大型ASP.NET MVC網站的性能,並且我正在尋找一種將緩存清除查詢字符串添加到圖像請求的方式,我不必瀏覽所有視圖和CSS並更改每個圖像引用。如何將緩存驅動添加到ASP.NET MVC網站中的所有圖像

期望的結果

要驗證是否被添加緩存剋星。我正在使用Firefox的Firebug擴展和我所希望看到的是這樣的事情(截圖從其他網站獲取)

enter image description here

我已經試過

最簡單的答案似乎向我創建一個自定義HttpModule,它攔截任何圖像請求,然後將緩存清除查詢字符串附加到請求URL。所以我寫了下面的類

public class CacheBusterImageHandler : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += this.BeginRequest; 
    } 

    public void Dispose() 
    {    
    } 

    public void BeginRequest(object sender, EventArgs e) 
    { 
     // This conditional check will need to be modified to capture other image types 
     // but for testing purposes it is good enough 
     if (HttpContext.Current.Request.Path.EndsWith(".gif", StringComparison.OrdinalIgnoreCase)) 
     { 
      // The version number will be generated but again for testing purposes this 
      // is good enough 
      var pathWithCacheBuster = string.Format("{0}?v1.0.0.0", HttpContext.Current.Request.Path); 

      HttpContext.Current.RewritePath(pathWithCacheBuster); 
     } 
    } 
} 

我再註冊的模塊在web.config中像這樣

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="CacheBusterImageHandler" type="MyAssembly.CacheBusterImageHandler" preCondition="managedHandler" /> 
    ... 

然後我覈實,該請求被該模塊通過使用斷點得到處理,但是當我在Firebug中檢查圖像請求確實有而不是將緩存控制器添加到URL。然後我決定閱讀RewritePath方法的文檔,發現它當然只是重定向請求,但不會改變請求的URL。

問題

是否有一個HttpModule的方式追加緩存剋星的查詢字符串?

如果不是,有沒有其他方法可以實現相同的結果,而無需修改每個圖像的引用?

回答

1

「在HttpModule中是否有一種方法將緩存驅動程序附加到 查詢字符串?」

不會。在這個過程中,這遠遠晚了。當你把它放在頁面中時,URL必須被改變,這就是瀏覽器用來檢查圖像是否在緩存中的東西。

「如果沒有,是否有其他方法可以達到相同的結果,而不必 必須修改每個圖像的引用?

這取決於您如何將圖片網址放在網頁中,但是沒有辦法改變他的網址,這些網址可用於將網址放入網頁的所有方式。

您可以制定計算要包含的版本號/字符串的方法,並將其添加到所有網址。這樣你只需要做一次改變,而不是每次圖像改變。

如果您希望每次部署頁面時都使緩存失效或者映像文件的更新時間,則該方法可以使用程序集的版本號或編譯時間。

基本上是:

<img src="/images/logo.png<%= ImageVersion("/images/logo.png") %>" alt="Logo"> 

使用類似:

public static string ImageVersion(string name) { 
    FileInfo info = new FileInfo(HttpContect.Current.MapPath(name)); 
    int time = (int)((info.LastWriteTimeUtc - new DateTime(2000,1,1)).TotalMinutes); 
    return "?v=" + time.ToString(); 
} 
+0

這就是答案,我很害怕。實際上,我已經寫了一個HTML幫助器來添加一個帶有版本號的img標籤,但問題是(a)有太多需要改變的地方,(b)我需要在CSS中支持圖片引用。 – 2014-10-10 12:52:32

+0

@PaulHunt:CSS中的圖像更加困難。即使您使用代碼生成/後處理樣式表,以便您可以將緩存攔截器獲取到URL中,您也需要緩存攔截器來加載樣式表的鏈接標記。 – Guffa 2014-10-10 13:11:18

相關問題