2012-02-16 2 views
11

एएसपी.नेट एमवीसी 3 में [आउटपुट कैशएट्रिब्यूट] के साथ, आप लचीलेपन के अच्छे सौदे के साथ कैश आउटपुट कर सकते हैं। मेजबान नाम से बाल्टी कैशिंग में 'VaryByHeader' प्रॉपर्टी का लाभ उठाने के लिए उपयोगी है। उदाहरण के लिए:बच्चे के कार्यों पर आउटपुट कैशएट्रिब्यूट के साथ VaryByHeader

[OutputCache(Duration = 60, VaryByHeader = "host")] 
public ActionResult Foo() 
{ 
    return this.View(); 
} 

हालांकि, बाल कार्यों पर, आप 'VaryByHeader' लागू नहीं कर सकते हैं। ढांचा फेंकता निम्न अपवाद: बच्चे कार्यों के लिए

OutputCacheAttribute केवल अवधि, VaryByCustom, और VaryByParam मूल्यों का समर्थन करता है। कृपया कैशप्रोफाइल, स्थान, नोस्टोर, एसक्लड पर निर्भरता, VaryByContentEncoding, या बाल क्रियाओं के लिए VaryByHeader मान सेट न करें।

मेरा सवाल है, क्यों?

यही कारण है कि हम एक बच्चे की कार्रवाई में VaryByHeader नहीं कर सकते हैं क्योंकि यह एक विरोधाभासी भिन्नता प्रदान करेगा, क्योंकि मूल कार्रवाई ने एक अलग VaryByHeader मान निर्दिष्ट किया हो सकता है?

यदि मैं मेजबाननाम के आधार पर अलग-अलग बाल क्रियाओं को कैश करना चाहता हूं, तो इसका क्या अर्थ है, और मैं इसके बारे में कैसे जाऊं?

+0

बस उत्सुक, बच्चे कार्रवाई कर एक और HTTP पाने का कारण? हो सकता है कि इस विचार के डिजाइनरों ने कहा कि चूंकि कोई _second_ पोस्ट वापस नहीं है, इसलिए अलग-अलग http शीर्षलेखों द्वारा कैश करने की आवश्यकता नहीं होगी। –

+0

नहीं, बच्चे के कार्य एक ही अनुरोध के भीतर सिर्फ एक अमूर्त हैं। –

उत्तर

13

VaryByHeader वास्तविक HTTP प्रतिक्रिया शीर्षकों को प्रभावित करता है; तो आप शायद सही हैं कि एमवीसी टीम ने पैरेंट एक्शन के साथ संघर्ष को रोकने के लिए इसे अवरुद्ध कर दिया है।

होस्टनाम के आधार पर कैश करने के लिए, क्या आप VaryByCustom का उपयोग नहीं कर सकते? (: इस प्रयास नहीं किया है बिल्कुल त्याग): की तरह कुछ

[OutputCache(Duration = 60, VaryByCustom = "host")] 
public ActionResult Foo() 
{ 
    return View(); 
} 

के बाद (अपने Global.asax.cs में)

public override string GetVaryByCustomString(HttpContext context, string arg) 
{ 
    if (arg == "host") 
    { 
     return context.Request.Headers["host"]; 
    } 

    // whatever you have already, or just String.Empty 
    return String.Empty; 
} 
+1

होस्ट नाम पर कैशिंग केवल VaryByHeader का उपयोग कर संभव है। एक मेजबाननाम परिदृश्य में, उदाहरण के लिए, मेजबान ए के लिए एक बार, और एक बार मेजबान बी के लिए बच्चे की कार्रवाई दो बार कैश की जाएगी। आपको VaryByCustom का उपयोग करने की आवश्यकता नहीं होगी। (हालांकि आपकी विधि वास्तव में भी काम करेगी, और शायद वेरीबीहेडर के कार्यान्वयन के समान ही है)। –

+1

बेशक, लेकिन चूंकि आप अपने चाइल्डएक्शन में 'VaryByHeader' का उपयोग नहीं कर सकते ... :) – bhamlin

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