2009-09-17 10 views
5

मैं अपने एएसपी.नेट एमवीसी वेबसाइट में आउटपुट कैशिंग का उपयोग करने की कोशिश कर रहा हूं। समस्या यह है कि, जब मैं अपने क्वेरीस्ट्रिंग पैराम्स के मान को आजमाता और बदलता हूं, तो यह अनुरोध किया गया था कि पहले आइटम के लिए डेटा वापस कर रहा है!कैशिंग मेरे एएसपी.नेट एमवीसी वेबसाइट में सही काम नहीं कर रहा है?

यहाँ नोट 1 (परम नाम बदल के साथ) मेरी कोड है ...

[ApiAuthorize] 
[HandleErrorAsJson] 
public class SearchController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    [OutputCache(Duration = 60, VaryByParam = "*")] 
    public ActionResult ScoreCard(string foo, byte? bar, byte? pewpew) 
    { 
    .. 
    } 
} 
  • : ApiAuthorize - कस्टम विशेषता है कि 'कुंजी' नामक एक क्वेरी स्ट्रिंग परम जांच करता है और स्मृति शब्दकोश में एक की जाँच करता है, यह देखने के लिए कि यह मौजूद है या नहीं।
  • नोट 2: हैंडलररएएसजेसन - कस्टम विशेषता जो त्रुटि संदेश को जेसन के रूप में लौटाती है यदि कोई अपवाद/फेंक दिया गया हो।

और यहाँ दो नमूना कॉल मैं इस कार्रवाई के लिए बना रही हूँ है: -

तो पहली कॉल से डेटा प्राप्त (foo = हैलो वर्ल्ड, प्यू प्यू) 200 ओके के रूप में वापस आ गया है। फिर दूसरा एपीआई कॉल 200 ओके देता है लेकिन पिछले कॉल के डेटा के साथ।

इसके अलावा, मैं किसी भी प्रॉक्सी सर्वर का उपयोग नहीं कर रहा हूं। अगर मैं आउटपुट कैश विशेषता को टिप्पणी करता हूं, तो सब अच्छा है।

मैं भी निम्न (मैन्युअल रूप से हर बार मैं कैश की जरूरत लिस्टिंग) ..... की कोशिश की है

[OutputCache(Duration = 60, VaryByParam = "foo,key,bar,pewpew")] 

कोई भाग्य :(

सूचना मैं कैसे यकीन है कि बनाने की जरूरत है मैं कैश अद्वितीय कुंजी के हिस्से के रूप में एपीआई 'कुंजी' पैरामीटर शामिल करें। मैं लोगों को एक ही चीज़ की तलाश नहीं करना चाहता, लेकिन अगर दूसरे व्यक्ति के पास सही कुंजी नहीं है, तो उन्हें कैश किए गए परिणाम नहीं मिलना चाहिए , लेकिन एक त्रुटि संदेश (तकनीकी रूप से, यह एक 401 अधिकृत नहीं है, लेकिन वैसे भी) ...

तू ghts?

उत्तर

4

VaryByParam में पैरामीटर की सूची अर्धविराम को सीमित किया जाना चाहिए, अल्पविराम सीमित नहीं है। कोशिश करो। उस ने कहा, * काम करना चाहिए था।

+0

+1 सीधे सीधे प्रश्न पर ध्यान केंद्रित किया गया। हालांकि मुझे नहीं लगता कि यह एकमात्र मुद्दा है जो उसके पास है। नीचे भी आपकी टिप्पणी का जवाब दिया। – dove

0

मैं आउटपुट कैशिंग के लिए एक फ़िल्टर का उपयोग करता हूं जो डिबगिंग के लिए प्रोग्रामेटिक नियंत्रण प्रदान करेगा और इसे होने पर भी सेट करेगा। इस का उपयोग करें और अगर यह यहाँ की स्थापना अंतर जो मुझे लगता है कि (यह भी सुनिश्चित करें कि किसी भी पिछले कैशिंग को मंजूरी दे दी है) हो सकता है

public class CacheFilterAttribute : ActionFilterAttribute 
    { 
     private const int Second = 1; 
     private const int Minute = 60 * Second; 
     private const int Hour = 60 * Minute; 
     public const int SecondsInDay = Hour * 24; 


     /// <summary> 
     /// Gets or sets the cache duration in seconds. The default is 10 seconds. 
     /// </summary> 
     /// <value>The cache duration in seconds.</value> 
     public int Duration 
     { 
      get; 
      set; 
     } 

     public int DurationInDays 
     { 
      get { return Duration/SecondsInDay; } 
      set { Duration = value * SecondsInDay; } 
     } 

     public CacheFilterAttribute() 
     { 
      Duration = 10; 
     } 

     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      if (Duration <= 0) return; 

      HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
      TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration); 

      cache.SetCacheability(HttpCacheability.Public); 
      cache.SetExpires(DateTime.Now.Add(cacheDuration)); 
      cache.SetMaxAge(cacheDuration); 
      cache.AppendCacheExtension("must-revalidate, proxy-revalidate"); 
     } 
    } 

होगा मैं सिर्फ एक बहुत ही स्थिर भाग के लिए अब तक इस का उपयोग कर रहा है देखने के लिए स्वतंत्र महसूस एक साइट के, इसलिए, इस

[CacheFilter(DurationInDays = 1)] 

जैसा कॉल जाहिर है आप सिर्फ इस VaryByParams एक संपत्ति के रूप में सामने आ रहा है करने के लिए विस्तार करने के लिए करना चाहते हैं प्रदान कर सकते हैं, लेकिन लगता है कि आप जानते होंगे कि क्या करना है।

+0

ब्याज से, आपने अपना खुद का गुण क्यों बनाया, यहां? –

+0

मैंने कुछ विचारों पर आवेदन किया और और भी करेंगे। मैं ऊपर देखे गए सटीक सेटिंग्स पर 100% नहीं था और इसलिए इसके साथ मैं आसानी से ट्विक कर सकता था और जानता था कि यह हर जगह लागू किया गया था।मैं अभी भी तय नहीं हूं कि कैश सेट करते समय अधिक हेडर जोड़ना है या नहीं। बेशक अगर मुझे यह एक बुरा विचार लगता है तो मैं इसे आउटपुट कैश विशेषता का एक साफ विस्तार कर सकता हूं और कुछ भी नहीं खो सकता। तो संक्षेप में, यदि कोई जोखिम उठता है तो सुरक्षा के लिए स्पष्ट मार्ग के साथ कुछ हासिल करना था। – dove

+0

यहां जो कुछ भी किया गया है उसके साथ कुछ भी गलत नहीं है, लेकिन यह आपके प्रश्न का उत्तर नहीं देता है। वह फ़िल्टर जो बनाया गया है वह * ब्राउज़र * कैशिंग को प्रभावित करता है, न कि सर्वर कैशिंग। ऐसा करना वैध है, और मुझे एएसपी.नेट एमवीसी में निर्मित किसी भी चीज़ से अवगत नहीं है जो यह करता है। यह भी, एक अच्छा मुद्दा बनाता है, जो कि यहां खेलने पर दो अलग-अलग कैश हैं, ब्राउज़र में से एक और सर्वर में से एक। आपका प्रश्न मुझे सर्वर कैश से संबंधित होने के लिए प्रतीत होता है, हालांकि फ़ायरबग या फिडलर के साथ इसे दोबारा जांचना अच्छा होगा। –

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