मेरे पास एक एएसपी.NET IHttpModule कार्यान्वयन है जो फ़ाइलों की सेवा के लिए पथ को फिर से लिखने के लिए डिज़ाइन किया गया है। इस प्रकार मॉड्यूल, केवल एक घटना, PostAuthenticateRequest
संभालता है:एएसपी.नेट एचटीपी मॉड्यूल रीवाइटपाथ वर्चुअल निर्देशिका कैश रीफ्रेशिंग
void context_PostAuthenticateRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Request.Path.ToLower().Contains("foobar"))
{
HttpContext.Current.RewritePath("virtdir/image.png");
}
}
पथ "virtdir", आवेदन की एक वर्चुअल निर्देशिका बच्चा है। आवेदन अपने आप में एक विशिष्ट स्थान में चलता है: C: \ inetpub \ wwwroot \ IisModuleCacheTest \ वर्चुअल निर्देशिका "virtdir 'सी करने के लिए मैप किया गया है: \ TestVirtDir \
http://myserver/iismodulecachetest/foobar
करने के लिए एक अनुरोध है, उम्मीद के रूप में, से image.png वापस आ जाएगी आभासी निर्देशिका। समान रूप से, http://myserver/iismodulecachetest/virtdir/image.png
पर एक अनुरोध एक ही छवि फ़ाइल लौटाएगा।
मैं तो प्रदर्शन के बाद:
- अनुरोध
http://myserver/iismodulecachetest/foobar
- सीधे संशोधित C: \ testvirtdir \ image.png (रंग में रंग बदलने और फिर से बचाने के लिए)।
- दोहराना।
1 और 20 दोहराव के बीच कहीं भी कुछ सेकंड अलग होने के बाद, वापस लौटाई गई छवि एक पुरानी प्रतिलिपि होगी।
एक बार परेशान होने के बाद, सर्वर केवल अज्ञात समय के बाद वर्तमान संस्करण को वापस कर देगा (10 सेकंड से कुछ मिनट तक)। यदि मैं http://myserver/iismodulecachetest/virtdir/image.png
के साथ चरण 1 में यूआरएल को प्रतिस्थापित करता हूं, तो समस्या उत्पन्न नहीं होती है। लेकिन आश्चर्यजनक रूप से पर्याप्त है, "foobar" यूआरएल का उपयोग करके समस्या उत्पन्न हुई है, सीधा यूआरएल भी छवि की एक पुरानी प्रतिलिपि वापस करना शुरू कर देता है।
प्रासंगिक विवरण:
- एप्लिकेशन-पूल की पुनरावृत्ति समस्या का समाधान।
- कुछ समय प्रतीक्षा करने से समस्या हल हो जाती है।
- बार-बार फ़ाइल को फिर से सहेजने पर कोई प्रभाव नहीं दिखता है। मुझे आश्चर्य हुआ कि अगर "फाइल संशोधित" घटना खो रही है, लेकिन एक बार अटक गया तो मैं आधा दर्जन संशोधनों को बचा सकता हूं और आईआईएस स्टिल एक नई प्रतिलिपि नहीं लौटाता है।
- web.config में कैश को अक्षम करने से कोई फर्क नहीं पड़ता।
<caching enabled="false" enableKernelCache="false" />
- तथ्य यह है कि यह एक वर्चुअल निर्देशिका है, यह तथ्य है कि मैं छवि के साथ समस्या को दोहराने नहीं कर सकता था।
- यह क्लाइंट-कैश नहीं है, यह निश्चित रूप से सर्वर पुराने संस्करण को वापस कर रहा है। मैंने अनुरोध हेडर, Ctrl + F5 रीफ्रेशिंग की जांच करके इसे अलग-अलग ब्राउज़रों का उपयोग करके सत्यापित किया है।
- मैंने इस मुद्दे को दो मशीनों पर दोहराया है। विन 7 प्रो 6.1.7601 एसपी 1 + आईआईएस 7.5.7600.16385 और सर्वर 2008 आर 2 6.1.7601 एसपी 1 + आईआईएस 7.5.7600.16385।
संपादित करें - अधिक जानकारी:
- सर्वर के स्तर पर कैश और कर्नेल कैश को अक्षम करने से कोई फर्क नहीं पड़ता।
- यूआरएल में विस्तार जोड़ने से कोई फर्क नहीं पड़ता
http://myserver/iismodulecachetest/foobar.png
। - आईआईएस को डीबगर संलग्न करने से
context_PostAuthenticateRequest
ईवेंट हैंडलर हर बार ट्रिगर किया जा रहा है और कैश फंस गया है या नहीं, वैसे ही व्यवहार कर रहा है। ।
EDIT2 - IIS लॉग्स:
मैं "अनुरोध ट्रेसिंग विफल" सक्षम आईआईएस (दिलचस्प है कि यह कैसे गैर -failed भी अनुरोध के लिए काम करता है, तो उचित रूप से कॉन्फ़िगर में पाइपलाइन कदम जब तक समान निर्भर है । 17 जहां नवीनतम संस्करण से बाहर लौटने अनुरोध स्पष्ट रूप से एक कैश से पता चलता मारा
पहले अनुरोध बस ठीक लग रहा है, एक कैश याद आती है साथ:
लेकिन एक बार यह अटक जाता है, यह बार-बार एक कैश हिट पता चलता है:
कैश हिट के बाद की घटनाओं, कर रहे हैं जाहिर है, काफी कैश मिस परिदृश्य की तुलना में अलग। यह वास्तव में ऐसा लगता है कि आईआईएस पूरी तरह से सामग्री है कि यह सोचने के लिए पूरी तरह से सामग्री है कि फाइल कैश अद्यतित है, जब यह निश्चित रूप से नहीं है! :(
एक छोटी सी आगे ढेर नीचे हम पहले अनुरोध देखें:
और फिर बाद में (दोषपूर्ण) कैश प्रभावित अनुरोध:
भी ध्यान रखें कि निर्देशिका स्पष्ट रूप से पर निगरानी रखी गई है, FileDirmoned="true"
के अनुसार।
क्या आप पुष्टि कर सकते हैं कि फ़ाइल में संशोधित दिनांक वास्तव में बदलती है? –
हां, अभी परीक्षण किया गया। विंडोज एक्सप्लोरर स्पष्ट रूप से फ़ाइल के लिए एक नई संशोधन तिथि दिखाता है, लेकिन आईआईएस अभी भी पुराने संस्करण को वापस कर रहा है। एचटीपी हेडर "लास्ट-संशोधित" * पुरानी * संशोधन तिथि भी वापस कर रहा है। – Snixtor
मैं माइक्रोसॉफ्ट के साथ एक सपोर्ट टिकट खोलूंगा। यह स्पष्ट रूप से एक बग है, इसलिए यह 100% मुफ़्त होना चाहिए। –