2012-07-03 18 views
5

मैं HTML5 का उपयोग कर एक छोटे से एकल पृष्ठ एप्लिकेशन पर काम कर रहा हूं। एक विशेषता पृष्ठ में एम्बेडेड पीडीएफ दस्तावेज़ों को दिखाने के लिए है, जो दस्तावेजों को एक सूची के रूप में चुना जा सकता है।क्रोम इन दो परिदृश्यों में क्लाइंट कैश का अलग-अलग उपयोग क्यों करता है?

नहीं, मैं क्रोम (पहले, और फिर अन्य सभी आधुनिक ब्राउज़रों) को स्थानीय क्लाइंट कैश का उपयोग करने के लिए सर्वर के माध्यम से बिना पीडीएफ दस्तावेजों के लिए सरल जीईटी अनुरोध पूरा करने की कोशिश कर रहा हूं (पाठ्यक्रम के पहले समय के अलावा))। मैं HTML में <object> तत्व पर "डेटा" संपत्ति सेट करके पीडीएफ फ़ाइल का अनुरोध करने का कारण बनता हूं।

मुझे working example for XMLHttpRequest (<object> नहीं मिला) मिला है। यदि आप Chrome की डेवलपर उपकरण (नेटवर्क टैब) का उपयोग करते हैं जैसा कि आप देख सकते हैं कि पहले अनुरोध सर्वर को जाता है, और इन हेडर के साथ एक प्रतिक्रिया में परिणाम:

Cache-Control:public,Public 
Content-Encoding:gzip 
Content-Length:130 
Content-Type:text/plain; charset=utf-8 
Date:Tue, 03 Jul 2012 20:34:15 GMT 
Expires:Tue, 03 Jul 2012 20:35:15 GMT 
Last-Modified:Tue, 03 Jul 2012 20:34:15 GMT 
Server:Microsoft-IIS/7.5 
Vary:Accept-Encoding 

दूसरा अनुरोध स्थानीय कैश से किसी भी सर्वर के बिना पेश किया जाता है roundtrip, जो मैं चाहता हूँ।

मेरे अपने आवेदन में वापस, मैं तो एएसपी-NET इस्तेमाल किया MVC 4 और मेरे नियंत्रक पर

[OutputCache(Duration=60)] 

निर्धारित किया है। इस नियंत्रक करने के लिए पहले अनुरोध - यूआरएल के साथ http://localhost:63035/?doi=10.1155/2007/98732 परिणाम निम्न हेडर में:

Cache-Control:public, max-age=60, s-maxage=0 
Content-Length:238727 
Content-Type:application/pdf 
Date:Tue, 03 Jul 2012 20:45:08 GMT 
Expires:Tue, 03 Jul 2012 20:46:06 GMT 
Last-Modified:Tue, 03 Jul 2012 20:45:06 GMT 
Server:Microsoft-IIS/8.0 
Vary:* 

सर्वर से एक और गोल यात्रा में दूसरा अनुरोध परिणाम, एक बहुत जल्दी प्रतिक्रिया के साथ (सुझाव सर्वर-साइड संचय?), ​​लेकिन 200 रिटर्न ठीक है और इन हेडर:

Cache-Control:public, max-age=53, s-maxage=0 
Content-Length:238727 
Content-Type:application/pdf 
Date:Tue, 03 Jul 2012 20:45:13 GMT 
Expires:Tue, 03 Jul 2012 20:46:06 GMT 
Last-Modified:Tue, 03 Jul 2012 20:45:06 GMT 
Server:Microsoft-IIS/8.0 
Vary:* 

अभी तक एक और गोल यात्रा में उसी यूआरएल परिणामों के लिए तीसरे अनुरोध और इन हेडर के साथ एक 304 प्रतिक्रिया:

Cache-Control:public, max-age=33, s-maxage=0 
Date:Tue, 03 Jul 2012 20:45:33 GMT 
Expires:Tue, 03 Jul 2012 20:46:06 GMT 
Last-Modified:Tue, 03 Jul 2012 20:45:06 GMT 
Server:Microsoft-IIS/8.0 
Vary:* 

मेरा प्रश्न है, वांछित व्यवहार प्राप्त करने के लिए मुझे आउटपुट कैश विशेषता कैसे सेट करनी चाहिए (यानी। शुरुआती अनुरोध के एक्स सेकंड के भीतर, ग्राहक कैश से पूर्ण पीडीएफ अनुरोध)?

या, क्या मैं सही तरीके से काम नहीं कर रहा हूं जब मैं <object> तत्व पर "डेटा" संपत्ति सेट करके पीडीएफ प्रदर्शित करने का कारण बनता हूं?

उत्तर

0

आप OutputCache स्थान संपत्ति की स्थापना का अर्थ हो सकता करने के लिए "कोई भी" जो "क्लाइंट"

[OutputCache(Duration=60, Location = OutputCacheLocation.Client)] 

डिफ़ॉल्ट स्थान संपत्ति सेट कर दिया जाता है कि इनके द्वारा प्रतिक्रिया ग्राहक पर कैश किया गया है एक पर की कोशिश की है प्रॉक्सी, या सर्वर पर।

अधिक MSDN OutputCacheLocation

+1

बिल्कुल नहीं। क्लाइंट को स्थान सेट करना (HTTP कैश-कंट्रोल हेडर में "निजी" के समतुल्य) साझा कैश स्थानों को कैश करने के लिए नहीं बताता है। लेकिन यह प्रभावित नहीं करना चाहिए कि क्लाइंट ब्राउज़र इसे कैश करने का फैसला करता है या नहीं। – ToolmakerSteve

1

ग्राहकों पर कभी नहींकैश करने के लिए बाध्य कर रहे हैं। प्रत्येक ब्राउजर यह तय करने के लिए अपने ही ह्युरिस्टिक का उपयोग करने के लिए स्वतंत्र है कि यह किसी ऑब्जेक्ट को कैश करने योग्य है या नहीं। आखिरकार, कैश के अन्य उपयोगों के साथ कैश का कोई भी उपयोग "प्रतिस्पर्धा" करता है।

कैशिंग को गारंटी पर त्वरित प्रतिक्रिया नहीं दी गई है; यह औसतन, की संभावनाओं को बढ़ाने के लिए डिज़ाइन किया गया है जो अक्सर उपयोग किए जाने वाले संसाधन पहले से ही नहीं होंगे।आप जो करने की कोशिश कर रहे हैं, वह कैश को मदद करने के लिए डिज़ाइन नहीं किया गया है।

आपके द्वारा रिपोर्ट किए गए परिणामों के आधार पर, 2012 में उपयोग किए जाने वाले क्रोम का संस्करण यह तय करता है कि 60 सेकंड में समाप्त होने वाली ऑब्जेक्ट को कैश करने के लिए यह व्यर्थ था, और केवल एक बार पूछा गया था। इसलिए इसे इस्तेमाल करने के बाद, पहली प्रतिलिपि फेंक दी। फिर आपने दूसरी बार पूछा, और यह इस यूआरएल को थोड़ा और प्राथमिकता देना शुरू कर दिया - इसे हाल के यूआरएल याद रखना चाहिए, और देखा कि यह दूसरा अनुरोध था - यह प्रतिलिपि को कैश में रखता था, लेकिन जब तीसरा अनुरोध आया , सर्वर से यह सत्यापित करने के लिए कहा कि यह अभी भी वैध था (संभवतः क्योंकि समाप्ति समय केवल कुछ सेकंड दूर था)। सर्वर ने कहा "304 - संशोधित नहीं - आपके द्वारा कैश की गई प्रति का उपयोग करें"। यह फिर से पीडीएफ नहीं भेजा था।

आईएमएचओ, जो उचित कैश व्यवहार था, एक ऑब्जेक्ट के लिए जो जल्द ही समाप्त हो जाएगा।


आप मौका है कि पीडीएफ के आसपास लंबे समय तक रहेंगे बढ़ाने के लिए चाहते हैं, तो एक बाद की समाप्ति समय देते हैं, लेकिन कहते हैं कि यह अगर यह अभी भी मान्य है देखने के लिए सर्वर के साथ जांच करना चाहिए।

यदि HTTP कैश-कंट्रोल हेडर का उपयोग कर रहा है, तो यह हो सकता है: private, max-age: 3600, must-revalidate। इसके साथ, आपको सर्वर पर राउंड-ट्रिप देखना चाहिए, जो पृष्ठ मान्य होने तक 304 प्रतिक्रिया देगा। यह एक त्वरित प्रतिक्रिया होनी चाहिए, क्योंकि डेटा वापस भेजा गया है - ब्राउज़र का कैश संस्करण उपयोग किया जाता है।

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


तुम सच में सब पर सर्वर से बात नहीं कर के प्रदर्शन की जरूरत है, तो छिपाने/कि पीडीएफ पकड़े, बजाय यह छोड़ने, और इसके लिए पूछने के लिए की आवश्यकता होगी, डोम तत्व को दिखाने के लिए जावास्क्रिप्ट लिखने पर विचार फिर।

पृष्ठ के लिए आपका जावास्क्रिप्ट कोड एकमात्र ऐसा स्थान है जो "समझता है" कि आप वास्तव में पीडीएफ को चिपकाना चाहते हैं, भले ही आप इसे उपयोगकर्ता को नहीं दिखा रहे हों।