यहां 'समाप्त हो गया' शीर्षलेख के बारे में बहुत उलझन में हो रही है! कभी-कभी यह अपेक्षा के अनुसार काम करता है - और कुछ बार नहीं।क्रोम में परीक्षण करते समय हेडर की समय सीमा समाप्त हो जाती है
मैं अपने समाप्ति शीर्षलेख सेट करने के लिए निम्न कोड का उपयोग कर रहा हूं। ध्यान दें कि यह एक एमवीसी कस्टम विशेषता में एएसपी.नेट के साथ किया जा रहा है - यह वास्तव में यहां प्रासंगिक नहीं है - लेकिन बताता है कि 'filterContext'
कहां से आ रहा है। कभी कभी
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=413
Date: Wed, 18 Feb 2009 05:24:19 GMT
Expires: Wed, 18 Feb 2009 05:21:12 GMT
CurrentTime: 2/17/2009 9:21:12 PM
इस तरह::
HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);
// my own custom header so we know what time it was
filterContext.HttpContext.Response.AddHeader("CurrentTime", DateTime.Now.ToString());
cache.SetCacheability(HttpCacheability.Public);
cache.SetExpires(DateTime.Now.Add(cacheDuration));
cache.SetMaxAge(cacheDuration);
cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
यह कभी कभी मुझे हेडर इस तरह दे देंगे
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=600
Date: Wed, 18 Feb 2009 05:27:55 GMT
Expires: Wed, 18 Feb 2009 05:27:55 GMT
CurrentTime: 2/17/2009 9:27:55 PM
मैं फ़िडलर के माध्यम से सब कुछ चल रहा हूँ और देखने के लिए देख रहा है जब चीजें फिर से अनुरोध कर रहे हैं और जब वे ब्राउज़र कैश से आते हैं।
अब अजीब बात आईई में है, कैशिंग हमेशा अपेक्षित काम करता है। मेरे एएसपी.नेट एमवीसी एक्शन विधि का लिंक फिडलर में दिखाई देता है और फिर जब मैं उसी लिंक पर क्लिक करता हूं तो यह कैश से आ रहा है।
हालांकि क्रोम में यह कभी-कभी होगा और कभी-कभी कैश से नहीं आएगा! कैश से आने से मेरा मतलब कोई अतिरिक्त HTTP अनुरोध नहीं है।
उदाहरण के लिएइस तरह एक लिंक:
http://ipv4.fiddler:62669/gallery/mainimage/2
IE में कैश से आ जाएगा, लेकिन क्रोम में 200 के साथ वापस आ। फिर कभी-कभी क्रोम में यह कैश से आता है। मैंने ब्राउज़र कैश खाली करने और फिर से प्रयास करने का प्रयास किया है - हर बार एक ही परिणाम।
क्या क्रोम कुछ 'चालाक' करने की कोशिश कर रहा है और केवल बुरी तरह विफल रहा है - या मुझे अतिरिक्त शीर्षलेख की आवश्यकता है?
मुझे क्या आश्चर्य है कि अगर इस तथ्य के साथ मेरा कोई संबंध नहीं है कि मेरी Expires
हेडर तिथि वास्तव में भविष्य में कभी नहीं है। अगर मैं अपने hosted jQuery file के लिए Google के शीर्षकों को देखता हूं तो मुझे लगता है कि हेडर निम्नानुसार हैं (2010 में यहां समाप्त होने के साथ - भविष्य में एक वर्ष)।
Cache-Control: public, max-age=31536000
Date: Wed, 18 Feb 2009 05:44:53 GMT
Expires: Thu, 18 Feb 2010 05:44:53 GMT
वास्तव में भविष्य में समाप्त नहीं होना चाहिए ??
HTTP spec के अनुसार:
एक प्रतिक्रिया भी शामिल है दोनों एक शीर्षक और एक अधिकतम उम्र निर्देश समय-सीमा समाप्त, अधिकतम उम्र निर्देश ओवरराइड करता है हैडर समाप्त हो रहा है, भले ही समाप्त हो रहा है हैडर है अधिक प्रतिबंधक यह नियम एक मूल सर्वर को किसी दिए गए प्रतिक्रिया के लिए प्रदान करने की अनुमति देता है, एक HTTP/1.0 कैश की तुलना में एक HTTP/1.1 (या बाद में) कैश की समाप्ति समय । यह उपयोगी हो सकता है यदि कुछ HTTP/1.0 कैश अनुचित रूप से आयु या समाप्ति समय की गणना करते हैं, शायद desynchronized घड़ियों के लिए।
इसलिए ऐसा लगता है कि क्रोम को अधिकतम आयु के निर्देश का सम्मान करना चाहिए, भले ही 'समाप्ति' वर्तमान समय के समान ही हो, लेकिन ऐसा नहीं लगता है।
public virtual void RenderView(ViewContext viewContext) {
// TODO: Remove this hack. Without it, the browser appears to always load cached output
viewContext.HttpContext.Response.Cache.SetExpires(DateTime.Now);
ViewUserControlContainerPage containerPage = new ViewUserControlContainerPage(this);
// Tracing requires Page IDs to be unique.
ID = Guid.NewGuid().ToString();
RenderViewAndRestoreContentType(containerPage, viewContext);
}
तो यह बताता है कि क्यों मेरी Expires
हैडर हमेशा वर्तमान समय आ गया है:
मैंने इस एएसपीएक्स पेज पर <% = DateTime.Now.ToString()%> भी जोड़ा, और इसे नेटवर्क पर चलाया और यह अभी भी 200 के साथ हर बार वापस चला गया और समय अपडेट किया। लेकिन आईई में इसे 33 सेकंड के लिए कैश किया गया था। गड़बड़ –