2013-02-08 17 views
10

私は既にキャッシュに関する多くの記事を読んだことがありますが、実際に私のニーズに正確に合致するものはありません。私のMVC 3のアプリでは、画像の種類のファイルを返すアクションメソッドGetImage()があります。次に、画像を表示するビューでこのメソッドを使用します。asp.net mvcのビューにイメージを返すアクションメソッドの出力をキャッシュする方法は?

<img width="75" height="75" src="@Url.Action("GetImage", "Store", new {productId = item.ProductId})"/> 

サーバーにイメージをキャッシュします。だから、私はすでに試した何:

1)OutputCacheAttributeを使用する:200 OK)

2)次の応答を使用する:

[HttpGet, OutputCache(Duration = 10, VaryByParam = "productId", Location = OutputCacheLocation.Server, NoStore = true)] 
    public FileContentResult GetImage(int productId) 
    { 
     var p = _productRepository.GetProduct(productId); 
     if (p != null) 
     { 
      if (System.IO.File.Exists(GetFullProductImagePath(productId))) 
      { 
       var image = Image.FromFile(GetFullProductImagePath(productId)); 
       return File(GetFileContents(image), "image/jpeg"); 
      } 
     } 
     var defaultPath = AppDomain.CurrentDomain.BaseDirectory + 
          ConfigurationManager.AppSettings["default-images-directory"]; 

     var defaultImage = Image.FromFile(Path.Combine(defaultPath, "DefaultProductImage.jpg")); 
     return File(GetFileContents(defaultImage), "image/jpeg"); 
    } 

画像がキャッシュされません(私はステータスを取得します。

public FileContentResult GetImage(int productId) 
    { 
     Response.Cache.SetCacheability(HttpCacheability.Public); 
     Response.Cache.SetMaxAge(new TimeSpan(0, 0, 0, 10)); 
     Response.Cache.SetExpires(DateTime.Now.Add(new TimeSpan(0, 0, 0, 10))); 
     Response.Cache.AppendCacheExtension("must-revalidate, proxy-revalidate");   
     // other code is the same 
    } 

画像は

3にキャッシュされません)彼女:のgetImage()メソッドでのキャッシュ方法304を修正しませんが、のgetImage()メソッドは何も(空の画像)

public FileContentResult GetImage(int productId) 
    { 
     Response.StatusCode = 304; 
     Response.StatusDescription = "Not Modified"; 
     Response.AddHeader("Content-Length", "0");  
     // other code is the same 
    } 

を返しません。質問:E私は、取得方法、サーバー上でこのアクションメソッドの出力をキャッシュするには?注目すべき

[HttpGet] 
[OutputCache(
    Duration = 10, 
    VaryByParam = "productId", 
    Location = OutputCacheLocation.ServerAndClient)] 
public ActionResult GetImage(string productId) 
{ 
    ... 
} 

物事:OutputCacheLocation.ServerAndClientを使用してNoStore = trueの脱却

答えて

13

は次のように試してみてください。

+0

ありがとう、それは完璧に動作します!しかし、私はこれを取得しません:私はちょうどサーバーまたはクライアント上で別にイメージをキャッシュすることはできませんか? –

+1

しかし、サーバー上でのみイメージをキャッシュすると、このサーバーは常に**ヒットします。クライアントはイメージをキャッシュしておらず、コピーもありません。クライアントがこのイメージをどこから得ると思いますか?だからあなたは200ステータスコードを取得します。違いは、高価なコントローラーアクションがサーバー上で呼び出されないが、イメージがキャッシュからクライアントに直接提供されることです。 –

+0

ここに必要ですか?VaryByParam = "ProductId"?結果に影響しないようですか?また、「ServerAndClient」は、すべてのユーザーが同じキャッシュイメージを取得することを意味します。 –

関連する問題