2013-02-08 35 views
10

मैंने पहले से ही कैशिंग के बारे में बहुत सी पोस्ट पढ़ी हैं, लेकिन उनमें से कोई वास्तव में मेरी ज़रूरतों से बिल्कुल मेल नहीं खाता है। मेरे एमवीसी 3 ऐप में मेरे पास एक एक्शन विधि GetImage() है जो छवि प्रकार की फ़ाइल लौटाती है। फिर मैं छवि को प्रदर्शित करने के लिए इस विधि का उपयोग करता हूं:एक्शन विधि के आउटपुट को कैश करने के लिए कैसे करें जो एएसपीनेट एमवीसी में दृश्य में छवि देता है?

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

मैं सर्वर पर छवियों को कैश करना चाहता हूं। तो, क्या मैं पहले से ही की कोशिश की है:

1) OutputCacheAttribute उपयोग करने के लिए: 200 ठीक)

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"); 
    } 

छवियाँ कैश नहीं किया है (मैं स्थिति मिलता है। एक GetImage() विधि में कैश तरीके:

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 कैश नहीं कर रहे हैं) उसका ई मैं: 304 संशोधित नहीं है, लेकिन GetImage() विधि कुछ भी नहीं (खाली छवि)

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

रिटर्न प्रश्न: कैसे एक सर्वर पर इस कार्रवाई विधि के उत्पादन में कैश करने के लिए?

उत्तर

13

इस तरह का प्रयास करें:

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

हालात को नोटिस: OutputCacheLocation.ServerAndClient का उपयोग करने और मिल गया NoStore = true से छुटकारा।

+0

धन्यवाद, यह पूरी तरह से काम करता है! लेकिन मुझे यह नहीं मिला: मैं सिर्फ सर्वर पर या क्लाइंट पर छवि को कैश नहीं कर सकता? –

+1

लेकिन जब आप केवल सर्वर पर छवि को कैश करते हैं, तो यह सर्वर ** हमेशा ** हिट होता है। ग्राहक ने छवि को कैश नहीं किया है और इसकी एक प्रति नहीं है। आपको लगता है कि ग्राहक कहां से इस छवि को प्राप्त करेगा? यही कारण है कि आपको 200 स्टेटस कोड मिलता है। अंतर यह है कि सर्वर पर आपकी महंगी नियंत्रक कार्रवाई नहीं की जाती है लेकिन छवि सीधे कैश से क्लाइंट तक परोसा जाता है। –

+0

क्या मुझे यहां VaryByParam = "ProductId" चाहिए? ऐसा लगता है कि यह परिणाम को प्रभावित नहीं करता है? और, जैसा कि मैंने पाया, "सर्वर एंड क्लाइंट" का अर्थ है कि सभी उपयोगकर्ताओं को एक ही कैश की गई छवियां मिलेंगी? –