2009-02-18 14 views
5

यहां 'समाप्त हो गया' शीर्षलेख के बारे में बहुत उलझन में हो रही है! कभी-कभी यह अपेक्षा के अनुसार काम करता है - और कुछ बार नहीं।क्रोम में परीक्षण करते समय हेडर की समय सीमा समाप्त हो जाती है

मैं अपने समाप्ति शीर्षलेख सेट करने के लिए निम्न कोड का उपयोग कर रहा हूं। ध्यान दें कि यह एक एमवीसी कस्टम विशेषता में एएसपी.नेट के साथ किया जा रहा है - यह वास्तव में यहां प्रासंगिक नहीं है - लेकिन बताता है कि '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 हैडर हमेशा वर्तमान समय आ गया है:

उत्तर

3

मैं ASP.NET MVC स्रोत कोड में निम्न पाया। हालांकि मैं सच में नहीं लगता कि यह क्या क्रोम अप ट्रिपिंग है क्योंकि मैं इस प्रकार सरल संभव पृष्ठ बनाया है और क्रोम अभी भी काफी खुशी से सर्वर के लिए वापस जा रहा था और मुझे एक 200

public partial class test : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     TimeSpan cacheDuration = TimeSpan.FromSeconds(33); 
     var cache = Response.Cache; 

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

मैंने इस एएसपीएक्स पेज पर <% = DateTime.Now.ToString()%> भी जोड़ा, और इसे नेटवर्क पर चलाया और यह अभी भी 200 के साथ हर बार वापस चला गया और समय अपडेट किया। लेकिन आईई में इसे 33 सेकंड के लिए कैश किया गया था। गड़बड़ –

1

मैंने दे रही है काफी हद तक निष्कर्ष निकाला है कि क्रोम वास्तव में कैशिंग के साथ वास्तव में कुछ कर रहा है।

मैंने इसे सबसे कम संभव स्तर तक सरल बना दिया - Google के सर्वर से jQuery प्राप्त करना।

http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js 

क्रोम के लिए, और फ़िडलर निम्नलिखित अनुरोध के साथ आया था:

मैं में टाइप

Requests started at: 22:58:00:7756 
Responses completed at: 22:58:03:5020 
Total Sequence time: 00:00:02.7263880 
DNS Lookup time: 531ms 
TCP/IP Connect time: 63ms 

RESPONSE CODES 
-------------- 
HTTP/200: 1 

हेडर इस प्रकार थे (नोट समाप्त हो रहा है आज के बाद 1 वर्ष):

Cache-Control: public, max-age=31536000 
Date: Wed, 18 Feb 2009 06:58:01 GMT 
Expires: Thu, 18 Feb 2010 06:58:01 GMT 
Vary: Accept-Encoding 

और फिर मैंने कुछ से इंतजार किया conds और हिट दर्ज करें - एक ही टैब में। Fiddler एक और ** 200 * अनुरोध के साथ आया था:

Requests started at: 22:58:09:2516 
Responses completed at: 22:58:12:3999 
Total Sequence time: 00:00:03.1482360 

RESPONSE CODES 
-------------- 
HTTP/200: 1 

और हेडर थे:

Cache-Control: public, max-age=31536000 
Date: Wed, 18 Feb 2009 06:58:09 GMT 
Expires: Thu, 18 Feb 2010 06:58:09 GMT 
Vary: Accept-Encoding 

जाहिर है यह नहीं है कि मैं क्या उम्मीद कर रहा था।

हाँ - स्वीकृति-एन्कोडिंग दोनों अनुरोधों के लिए समान था।

हाँ - एक थर्ड अनुरोध मुझे दिया एक 304

यह Chrome है कि मैं किसी भी विकास पर कभी नहीं किया था के स्थापित एक नया पर था - और जिस पर मैं केवल सिर्फ पहली के लिए फ़िडलर स्थापित होगी पहर।

मैं किसी के लिए यह बताने के लिए इंतजार नहीं कर सकता। अभी के लिए मैं हार रहा हूँ - मुझे लगता है कि मेरा कैशिंग और समाप्ति कोड ठीक है। इसके अलावा एएसपी.नेट एमवीसी को मजबूर होना प्रतीत होता है कि वर्तमान समय होने का समय समाप्त हो गया है। यह स्पष्ट रूप से मेरे Google उदाहरण में एक कारक नहीं है।

मुझे लगता है कि क्रोम बहुत चालाक है और यह एक बग होना है - मैं संस्करण 1.0.154.48 पर हूं।

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