2011-12-01 13 views
7

पृष्ठभूमि कहानी:आईई 8 और क्लाइंट-साइड संचय

मैं एक आईआईएस 6 वेब सर्वर पर .NET 3.5 में एक वेब पोर्टल है। वर्तमान में एक ऐसा पृष्ठ है जिसे मूल्य दिया जाता है और उस मूल्य के आधार पर वेब सेवा पर एक पीडीएफ फाइल दिखती है और उपयोगकर्ता को वेब पेज में किसी अन्य टैब में परिणाम प्रदर्शित करती है। यह निम्नलिखित कोड के साथ किया जाता है।

context.Response.ClearContent(); 
context.Response.ClearHeaders(); 
context.Response.Clear(); 
context.Response.AddHeader("Accept-Header", pdfStream.Length.ToString());            
context.Response.ContentType = "application/pdf"; 
context.Response.BinaryWrite(pdfStream.ToArray()); 
context.Response.Flush(); 

यह काम करता है और वर्षों से काम करता है। हालांकि हमें क्लाइंट से कोई समस्या मिली कि एक विशेष ग्राहक पीडीएफ को हर बार एक ही पीडीएफ के रूप में लौटा रहा था जब तक कि वे अस्थायी इंटरनेट कैश को मंजूरी नहीं देते।

मैंने सोचा ओह अच्छा, यह एक आसान है। मैं केवल कैश हेडर को प्रतिक्रिया में जोड़ने के लिए प्रतिक्रिया दूंगा। इसलिए मैंने निम्नलिखित जोड़ा:

context.Response.Cache.SetCacheability(HttpCacheability.NoCache);//IE set to not cache 
context.Response.Cache.SetNoStore();//Firefox/Chrome not to cache 
context.Response.Cache.SetExpires(DateTime.UtcNow); //for safe measure expire it immediately 

त्वरित परीक्षण के बाद मुझे प्रतिक्रिया हेडर में बिल्कुल वही मिला जो मुझे उम्मीद थी।

Cache-Control no-cache, no-store 
Pragma no-cache 
Expires -1 

समस्या:

तो इस लाइव चला गया। सबकुछ शांत दिन लग रहा था। उसके बाद, बम, हर कोई सफेद स्क्रीन प्राप्त करना शुरू कर दिया और कोई पीडीएफ प्रदर्शित नहीं हुआ। आगे की जांच के बाद, मुझे पता चला कि यह केवल आईई 6,7,8 था। क्रोम ठीक है, फ़ायरफ़ॉक्स ठीक है, सफारी जुर्माना, यहां तक ​​कि आईई 9 जुर्माना भी है। यह जानने के बिना कि यह क्यों हुआ, मैंने अपना परिवर्तन वापस कर दिया और इसे तैनात कर दिया, और सब कुछ फिर से काम करना शुरू कर दिया।

मैंने यह पता लगाने की कोशिश की है कि मेरे कैशिंग हेडर आईई 6-8 को कोई फायदा नहीं पहुंचाते हैं। क्या किसी ने आईई 6-8 के साथ इस प्रकार के मुद्दे का अनुभव किया है? क्या मैं कुछ छोड़ रहा हूं? किसी भी अंतर्दृष्टि के लिए धन्यवाद।

उत्तर

6

मुझे समाधान मिला। यहाँ मुझे क्या फिसल गया है। Here is a link

मूल रूप से IE8 (और निचले) में कैश-कंट्रोल हेडर के साथ समस्याएं थीं यदि no-cache या store-cache थी। मैं मूल रूप से केवल निजी कैशिंग की अनुमति देकर समस्या के आसपास काम करने में सक्षम था और अधिकतम आयु को बहुत छोटा कर देता था, इसलिए यह लगभग तुरंत समाप्त हो जाता है।

//Ie 8 and lower have an issue with the "Cache-Control no-cache" and "Cache-Control store-cache" headers. 
//The work around is allowing private caching only but immediately expire it. 
if ((Request.Browser.Browser.ToLower() == "ie") && (Request.Browser.MajorVersion < 9)) 
{ 
    context.Response.Cache.SetCacheability(HttpCacheability.Private); 
    context.Response.Cache.SetMaxAge(TimeSpan.FromMilliseconds(1)); 
} 
else 
{ 
    context.Response.Cache.SetCacheability(HttpCacheability.NoCache);//IE set to not cache 
    context.Response.Cache.SetNoStore();//Firefox/Chrome not to cache 
    context.Response.Cache.SetExpires(DateTime.UtcNow); //for safe measure expire it immediately 
} 
+0

इसे पोस्ट करने के लिए धन्यवाद। मैंने इतने घंटों बर्बाद कर दिए और बहुत निराशा से यह पता लगाने की कोशिश की। –