2013-02-07 13 views
5

मेरे पास एक एएसपी.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 पर एक अनुरोध एक ही छवि फ़ाइल लौटाएगा।

मैं तो प्रदर्शन के बाद:

  1. अनुरोध http://myserver/iismodulecachetest/foobar
  2. सीधे संशोधित C: \ testvirtdir \ image.png (रंग में रंग बदलने और फिर से बचाने के लिए)।
  3. दोहराना।

1 और 20 दोहराव के बीच कहीं भी कुछ सेकंड अलग होने के बाद, वापस लौटाई गई छवि एक पुरानी प्रतिलिपि होगी।

एक बार परेशान होने के बाद, सर्वर केवल अज्ञात समय के बाद वर्तमान संस्करण को वापस कर देगा (10 सेकंड से कुछ मिनट तक)। यदि मैं http://myserver/iismodulecachetest/virtdir/image.png के साथ चरण 1 में यूआरएल को प्रतिस्थापित करता हूं, तो समस्या उत्पन्न नहीं होती है। लेकिन आश्चर्यजनक रूप से पर्याप्त है, "foobar" यूआरएल का उपयोग करके समस्या उत्पन्न हुई है, सीधा यूआरएल भी छवि की एक पुरानी प्रतिलिपि वापस करना शुरू कर देता है।

प्रासंगिक विवरण:

  1. एप्लिकेशन-पूल की पुनरावृत्ति समस्या का समाधान।
  2. कुछ समय प्रतीक्षा करने से समस्या हल हो जाती है।
  3. बार-बार फ़ाइल को फिर से सहेजने पर कोई प्रभाव नहीं दिखता है। मुझे आश्चर्य हुआ कि अगर "फाइल संशोधित" घटना खो रही है, लेकिन एक बार अटक गया तो मैं आधा दर्जन संशोधनों को बचा सकता हूं और आईआईएस स्टिल एक नई प्रतिलिपि नहीं लौटाता है।
  4. web.config में कैश को अक्षम करने से कोई फर्क नहीं पड़ता। <caching enabled="false" enableKernelCache="false" />
  5. तथ्य यह है कि यह एक वर्चुअल निर्देशिका है, यह तथ्य है कि मैं छवि के साथ समस्या को दोहराने नहीं कर सकता था।
  6. यह क्लाइंट-कैश नहीं है, यह निश्चित रूप से सर्वर पुराने संस्करण को वापस कर रहा है। मैंने अनुरोध हेडर, Ctrl + F5 रीफ्रेशिंग की जांच करके इसे अलग-अलग ब्राउज़रों का उपयोग करके सत्यापित किया है।
  7. मैंने इस मुद्दे को दो मशीनों पर दोहराया है। विन 7 प्रो 6.1.7601 एसपी 1 + आईआईएस 7.5.7600.16385 और सर्वर 2008 आर 2 6.1.7601 एसपी 1 + आईआईएस 7.5.7600.16385।

संपादित करें - अधिक जानकारी:

  1. सर्वर के स्तर पर कैश और कर्नेल कैश को अक्षम करने से कोई फर्क नहीं पड़ता।
  2. यूआरएल में विस्तार जोड़ने से कोई फर्क नहीं पड़ता http://myserver/iismodulecachetest/foobar.png
  3. आईआईएस को डीबगर संलग्न करने से context_PostAuthenticateRequest ईवेंट हैंडलर हर बार ट्रिगर किया जा रहा है और कैश फंस गया है या नहीं, वैसे ही व्यवहार कर रहा है। ।

EDIT2 - IIS लॉग्स:

मैं "अनुरोध ट्रेसिंग विफल" सक्षम आईआईएस (दिलचस्प है कि यह कैसे गैर -failed भी अनुरोध के लिए काम करता है, तो उचित रूप से कॉन्फ़िगर में पाइपलाइन कदम जब तक समान निर्भर है । 17 जहां नवीनतम संस्करण से बाहर लौटने अनुरोध स्पष्ट रूप से एक कैश से पता चलता मारा

पहले अनुरोध बस ठीक लग रहा है, एक कैश याद आती है साथ:

Good Request

लेकिन एक बार यह अटक जाता है, यह बार-बार एक कैश हिट पता चलता है:

Bad Request

कैश हिट के बाद की घटनाओं, कर रहे हैं जाहिर है, काफी कैश मिस परिदृश्य की तुलना में अलग। यह वास्तव में ऐसा लगता है कि आईआईएस पूरी तरह से सामग्री है कि यह सोचने के लिए पूरी तरह से सामग्री है कि फाइल कैश अद्यतित है, जब यह निश्चित रूप से नहीं है! :(

एक छोटी सी आगे ढेर नीचे हम पहले अनुरोध देखें:

Good Request 2

और फिर बाद में (दोषपूर्ण) कैश प्रभावित अनुरोध:

Bad Request 2

भी ध्यान रखें कि निर्देशिका स्पष्ट रूप से पर निगरानी रखी गई है, FileDirmoned="true" के अनुसार।

+0

क्या आप पुष्टि कर सकते हैं कि फ़ाइल में संशोधित दिनांक वास्तव में बदलती है? –

+0

हां, अभी परीक्षण किया गया। विंडोज एक्सप्लोरर स्पष्ट रूप से फ़ाइल के लिए एक नई संशोधन तिथि दिखाता है, लेकिन आईआईएस अभी भी पुराने संस्करण को वापस कर रहा है। एचटीपी हेडर "लास्ट-संशोधित" * पुरानी * संशोधन तिथि भी वापस कर रहा है। – Snixtor

+1

मैं माइक्रोसॉफ्ट के साथ एक सपोर्ट टिकट खोलूंगा। यह स्पष्ट रूप से एक बग है, इसलिए यह 100% मुफ़्त होना चाहिए। –

उत्तर

1

आप नीचे कुछ ऐसा कर सकते हैं।

void context_PostAuthenticateRequest(object sender, EventArgs e) 
{ 
    if (HttpContext.Current.Request.Path.ToLower().Contains("foobar")) 
    { 
     Random rnd = new Random(); 
     int randomNumber = rnd.Next(int.MinValue, int.MaxValue); 
     HttpContext.Current.RewritePath("virtdir/image.png?"+randomNumber); 
    } 
} 
+0

का मानना ​​है कि मुझे लगता है कि यह कैशिंग को विचलित कर देगा और इस प्रकार इस मुद्दे को बाईपास करेगा, हालांकि अभ्यास में 'रैंडम' के उदाहरण को दोहराने वाले मूल्यों से बचने के लिए सिंगलटन के रूप में माना जाना चाहिए। – Snixtor

+0

आप सही हैं, मैंने उस हिस्से को सही किया। – Cagatay

0

मुझे वर्चुअल निर्देशिका में स्थिर संसाधनों को संबोधित करने के लिए विधि RewritePath विधि का उपयोग कर एक ही समस्या थी। मेरे पास इस विधि के उपयोग के लिए कोई समाधान नहीं है लेकिन अंत में मैंने विधि Server.TransferRequest विधि का उपयोग करने का विकल्प चुना और इससे कोई कैशिंग समस्याएं नहीं दिखतीं।

HttpContext.Current.Server.TransferRequest(newUrl); 

अनुरोध हस्तांतरण IHttpModule द्वारा फिर से संसाधित किया जाता है, ताकि आप के लिए छोरों का उत्पादन नहीं सावधान रहने की जरूरत है।

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