2012-12-20 107 views
3

我正在使用ImageResizing庫來調整大小並在我的C#Mvc應用程序中傳遞圖像。在MVC應用程序中緩存圖像的正確方法

有一件事情沒有發生,雖然我的圖片沒有被緩存。

我很努力去理解爲每幅圖像適當地添加緩存需要什麼。

我只需要知道我是否在寫軌道?這會緩存我的圖片嗎?

我想我需要做的,是集FinalContentType,並FinalContentType在我ImageResizer_OnPostAuthorizeRequestStart(我不知道從哪裏得到這些值)

然後,我希望在Application_PreSendRequestHeaders我可以使用以下代碼正確設置緩存標頭。

我已經使用了here所述方法的修改版本。

這裏是我的代碼:

private static void ImageResizer_OnPostAuthorizeRequestStart(IHttpModule sender2, HttpContext context) 
     { 
      string path = Config.Current.Pipeline.PreRewritePath; 
      if (!path.StartsWith(PathUtils.ResolveAppRelative("~/s3"), StringComparison.OrdinalIgnoreCase)) return; 
     Config.Current.Pipeline.SkipFileTypeCheck = true; 
     Config.Current.Pipeline.ModifiedQueryString["cache"] = ServerCacheMode.Always.ToString(); 
    } 

    protected void Application_PreSendRequestHeaders(Object source, EventArgs e) 
    { 
     var app = source as HttpApplication; 

     HttpContext context = (app != null) ? app.Context : null; 

     if (context != null && context.Items != null && context.Items["FinalContentType"] != null && context.Items["LastModifiedDate"] != null) 
     { 
      //Clear previous output 
      //context.Response.Clear(); 
      context.Response.ContentType = context.Items["FinalContentType"].ToString(); 

      //FinalContentType is set to image/jpeg or whatever the image mime-type is earlier in code. 
      //Add caching headers 
      int mins = 1; //Or Configuration.AppSettings['whatever'] 

      if (mins > 0) 
      { 
       context.Response.Expires = 1; 
      } 

      var lastModified = (DateTime?)context.Items["LastModifiedDate"]; //Set earlier in code. 

      if (lastModified != DateTime.MinValue) 
      { 
       Response.Cache.SetLastModified(lastModified.Value); 
      } 

      Response.Cache.SetCacheability(context.Request.IsAuthenticated ? HttpCacheability.Private : HttpCacheability.Public); 
     } 

    } 
+0

'OutputCacheAttribute'沒有做你想做的事嗎?鏈接:http://msdn.microsoft.com/en-us/library/system.web.mvc.outputcacheattribute(v=vs.108).aspx –

+0

這些圖像在運行時由庫重新調整,以便緩存屬性不起作用,也是我特別想要緩存的圖像。 – shenku

+1

爲什麼它不工作? MSDN表示它將緩存內存中的操作方法的輸出。從本質上講,我明白,無論寫到響應中的任何內容都被保存在內存中,那就是你的二進制圖像數據。 –

回答

4

使用DiskCache和ClientCache插件來分別處理磁盤高速緩存和緩存頭。

ASP.NET輸出緩存在這裏沒用。

+1

爲什麼輸出緩存在這裏沒用?你能詳細說明嗎? – DarthVader

+0

我不確定它是無用的。 http://www.codeguru.com/csharp/.net/net_asp/article.php/c19835/Creating-a-Custom-Output-Cache-Provider-in-ASPNET-4.htm的快速掃描看起來很有前途(儘管再次,不使用ImageResizing)。我記得ImageResizing的DiskCache插件的好處是,IIRC有很多技巧用於限制執行的.NET代碼的數量,IIS「直接處理文件」。 http://imageresizing.net/plugins/diskcache – JayC

+0

嘗試clientcache我認爲這是要走的路,但不是那裏,其他建議歡迎,而我嘗試 – shenku

相關問題