我正在嘗試改進大型ASP.NET MVC網站的性能,並且我正在尋找一種將緩存清除查詢字符串添加到圖像請求的方式,我不必瀏覽所有視圖和CSS並更改每個圖像引用。如何將緩存驅動添加到ASP.NET MVC網站中的所有圖像
期望的結果
要驗證是否被添加緩存剋星。我正在使用Firefox的Firebug擴展和我所希望看到的是這樣的事情(截圖從其他網站獲取)
我已經試過
最簡單的答案似乎向我創建一個自定義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的方式追加緩存剋星的查詢字符串?
如果不是,有沒有其他方法可以實現相同的結果,而無需修改每個圖像的引用?
這就是答案,我很害怕。實際上,我已經寫了一個HTML幫助器來添加一個帶有版本號的img標籤,但問題是(a)有太多需要改變的地方,(b)我需要在CSS中支持圖片引用。 – 2014-10-10 12:52:32
@PaulHunt:CSS中的圖像更加困難。即使您使用代碼生成/後處理樣式表,以便您可以將緩存攔截器獲取到URL中,您也需要緩存攔截器來加載樣式表的鏈接標記。 – Guffa 2014-10-10 13:11:18