2010-10-01 8 views
7

मैं प्रदर्शन में सुधार करने के लिए कैशिंग में देखना शुरू कर रहा हूं और AJAX कॉल के लिए कैशिंग के बारे में कोई प्रश्न पूछ रहा हूं।एएसपी.नेट एमवीसी कैशिंग एजेक्स अनुरोध के लिए कैसे काम करता है?

मेरे पास एक ऐसी क्रिया है जिसका उपयोग ट्विटर से पूछने के लिए किया जाता है और फिर परिणाम लौटाता है। फिलहाल जब कोई उपयोगकर्ता बटन दबाता है तो यह घुमावदार gif लोड करता है, जबकि यह क्वेरी करने के लिए कार्रवाई पर जाता है और फिर आंशिक दृश्य देता है। jQuery फिर दृश्य से एचटीएमएल प्रतिक्रिया के साथ एक div अद्यतन करता है। आम तौर पर इसमें लगभग 5 सेकंड लगते हैं। उसके बाद और अधिक परिणाम प्राप्त करने के लिए एक और बटन होता है।

यदि मैं इस क्रिया पर कैशिंग एट्रिब्यूट डालूं तो क्या होगा? मुझे पता है कि मैं इसे आजमा सकता हूं लेकिन मैं चाहता हूं कि चीजों के तकनीकी पक्ष को समझाया जाए।

धन्यवाद

यहाँ मेरी जावास्क्रिप्ट है:

$('#blogEntryList #moreLink').live("click", function() { 


       $('#morespan').toggle(); 
       $('#loader').toggle(); 

       $.get($(this).attr("href"), function(response) { 
        $('#blogEntryList ol').append($("ol", response).html()); 
        $('#blogEntryList #moreLink').replaceWith($("#moreLink", response)); 
        $('#loader').hide(); 
        $('#morespan').show(); 
       }); 
       return false; 
      }); 

यहाँ मेरी संशोधित कार्रवाई है:

[OutputCache(
    Location = OutputCacheLocation.Server, 
    Duration = 100, 
    VaryByParam = "")] 
     public ActionResult BlogPosts(int? entryCount) 
     { 
      if (!entryCount.HasValue) 
       entryCount = defaultEntryCount; 

      int page = entryCount.Value/defaultEntryCount; 

      IEnumerable<BlogData> pagedEntries = GetLatestEntries(page, defaultEntryCount); 

      if (entryCount < totalItems) 
       AddMoreUrlToViewData(entryCount.Value); 

      return View("BlogEntries", pagedEntries); 
     } 

उत्तर

11

यहाँ यह कैसे काम करता है: कोई कैशिंग सर्वर साइड पर निर्दिष्ट संभालने, डिफ़ॉल्ट रूप से जीईटी अनुरोध ब्राउज़र द्वारा कैश किए जाएंगे और POST अनुरोध कैश नहीं किए जाते हैं जब तक आप AJAX अनुरोध भेजते समय cache: true विशेषता निर्दिष्ट करते हैं जो आपको अनुमति देता है क्लाइंट कैशिंग रणनीति ओवरराइड करें।

अब सर्वर की तरफ आप [OutputCache] के साथ अपनी नियंत्रक कार्रवाई को सजाने के लिए तैयार कर सकते हैं जो आपको विभिन्न कैशिंग रणनीतियों को परिभाषित करने की अनुमति देगा। आप सर्वर पर, डाउनस्ट्रीम प्रॉक्सी सर्वर पर या क्लाइंट पर कैश रख सकते हैं। आप विभिन्न समाप्ति नीतियों का प्रबंधन भी कर सकते हैं।

तो चलो एक उदाहरण के द्वारा इसे स्पष्ट करते हैं:

[OutputCache(
    Location = OutputCacheLocation.Server, 
    Duration = 10, 
    VaryByParam = "")] 
public ActionResult Hello() 
{ 
    return Content(DateTime.Now.ToLongTimeString(), "text/plain"); 
} 

और क्लाइंट की तरफ:

$.ajax({ 
    url: '/home/hello', 
    type: 'post', 
    success: function (result) { 
     alert(result); 
    } 
}); 

इस नियंत्रक कार्रवाई के परिणाम 10 सेकंड के लिए सर्वर पर संचित की जाएगी। इसका मतलब यह है कि सर्वर प्रत्येक अनुरोध पर मारा जाएगा लेकिन कैश किए गए संस्करण होने पर कार्रवाई निष्पादित नहीं की जाएगी और सीधे इस कैश से परोसा जाएगा। 10 सेकंड बाद नियंत्रक कार्रवाई को मारने वाले पहले अनुरोध से कैश की समयसीमा समाप्त हो जाएगी और वही प्रक्रिया दोहराई जाएगी।

+0

तो जब उपयोगकर्ता मेरी स्थिति में अधिक डेटा के लिए क्लिक करता है तो कैश की समाप्ति समाप्त होने तक यह पहले 10 बार परिणाम लौटाएगा? उस स्थिति में मैं शायद कैश का उपयोग नहीं करना चाहता क्योंकि जब वे अधिक डेटा के लिए क्लिक करते हैं तो इसे – Jon

+0

@ जोन कैश नहीं किया जा सकता है, तो आप 'वर्रीबैरम' प्रॉपर्टी का उपयोग एक्शन पैरामीटर नाम निर्दिष्ट करने के लिए कर सकते हैं जैसे उदाहरण पृष्ठ संख्या। –

+0

क्या VaryByParam में मानों का एक सीएसवी हो सकता है उदाहरण के लिए/यदि आपके पास 5 पृष्ठ संख्याएं हैं? – Jon

संबंधित मुद्दे